base_symbol.pas
来自「Delphi脚本控件」· PAS 代码 · 共 2,415 行 · 第 1/4 页
PAS
2,415 行
Module := -1;
Position := -1;
end;
result := Card;
end;
destructor TPAXSymbolTable.Destroy;
begin
EraseTail(0);
FreeMem(Mem, MemSize);
StateStack.Free;
inherited;
end;
procedure TPAXSymbolTable.SetName(I: Integer; const Name: String);
begin
A[I].PName := TPaxBaseScripter(Scripter).NameList.Add(Name);
end;
function TPAXSymbolTable.GetName(I: Integer): String;
var
Index: Integer;
begin
if I < 0 then
begin
result := DefinitionList.GetName(-I);
Exit;
end;
if I > Card then
begin
result := '';
Exit;
end;
Index := A[I].PName;
if Index > 0 then
begin
if Index < NameList.Count then
result := NameList[Index]
else
result := '';
end
else
result := '';
end;
function TPAXSymbolTable.GetFullName(I: Integer): String;
var
L: Integer;
begin
if I < 0 then
begin
result := DefinitionList.GetFullName(-I);
Exit;
end;
result := GetName(I);
L := GetLevel(I);
if (L > 0) and (L < Card) and (L <> RootNamespaceID) then
result := GetName(L) + '.' + result;
end;
procedure TPAXSymbolTable.SetLocal(ID: Integer);
begin
A[ID].Local := 1;
end;
function TPAXSymbolTable.IsLocal(ID: Integer): Boolean;
begin
result := A[ID].Local > 0;
end;
procedure TPAXSymbolTable.SetNameIndex(I, Value: Integer);
begin
A[I].PName := Value;
end;
function TPAXSymbolTable.GetNameIndex(I: Integer): Integer;
begin
if I > 0 then
result := A[I].PName
else
begin
result := DefinitionList.GetNameIndex(-I, Scripter);
end;
end;
procedure TPAXSymbolTable.SetKind(I, AKind: Integer);
begin
if I > 0 then
A[I].Kind := AKind;
end;
function TPAXSymbolTable.GetKind(I: Integer): Integer;
begin
if I > 0 then
result := A[I].Kind
else
result := DefinitionList.GetKind(-I);
end;
procedure TPAXSymbolTable.SetImported(I: Integer; Value: Boolean);
begin
if I > 0 then
A[I].Imported := Value;
end;
function TPAXSymbolTable.GetImported(I: Integer): Boolean;
begin
if I > 0 then
result := A[I].Imported
else
result := false;
end;
procedure TPAXSymbolTable.SetGlobal(I: Integer; Value: Boolean);
begin
if I > 0 then
A[I].Global := Value;
end;
function TPAXSymbolTable.GetGlobal(I: Integer): Boolean;
begin
if I > 0 then
result := A[I].Global
else
result := false;
end;
function TPAXSymbolTable.GetStrKind(I: Integer): String;
var
J: Integer;
begin
J := GetKind(I);
if (J >= 1) and (J <= PAXKinds.Count - 1) then
result := PAXKinds[J]
else
result := ' ';
end;
procedure TPAXSymbolTable.SetCount(I, ACount: Integer);
begin
A[I].Count := ACount;
end;
function TPAXSymbolTable.GetCount(I: Integer): Integer;
begin
if I > 0 then
result := A[I].Count
else
result := DefinitionList.GetCount(-I);
end;
function TPAXSymbolTable.GetParamTypeName(SubID, ParamIndex: Integer): String;
var
ParamID, TypeID: Integer;
begin
if SubID > 0 then
begin
ParamID := GetParamID(SubID, ParamIndex);
TypeID := GetType(ParamID);
result := GetName(TypeID);
end
else
begin
result := DefinitionList.GetParamTypeName(-SubID, ParamIndex);
end;
end;
function TPAXSymbolTable.GetParamName(SubID, ParamIndex: Integer): String;
var
ParamID: Integer;
begin
if SubID > 0 then
begin
ParamID := GetParamID(SubID, ParamIndex);
result := GetName(ParamID);
end
else
begin
result := DefinitionList.GetParamName(-SubID, ParamIndex);
end;
end;
function TPAXSymbolTable.GetTypeName(ID: Integer): String;
var
TypeID: Integer;
begin
if ID > 0 then
begin
TypeID := GetType(ID);
result := GetName(TypeID);
end
else
begin
result := DefinitionList.GetTypeName(-ID);
end;
end;
procedure TPAXSymbolTable.SetRank(I, ARank: Integer);
begin
if I > 0 then
A[I].Rank := ARank;
end;
function TPAXSymbolTable.GetRank(I: Integer): Integer;
begin
if I > 0 then
result := A[I].Rank
else
result := 0;
end;
procedure TPAXSymbolTable.SetNext(I, Value: Integer);
begin
A[I].Next := Value;
end;
function TPAXSymbolTable.GetNext(I: Integer): Integer;
begin
result := A[I].Next;
end;
procedure TPAXSymbolTable.SetModule(I, Value: Integer);
begin
A[I].Module := Value;
end;
function TPAXSymbolTable.GetModule(I: Integer): Integer;
begin
result := A[I].Module;
end;
procedure TPAXSymbolTable.SetPosition(I, Value: Integer);
begin
A[I].Position := Value;
end;
function TPAXSymbolTable.GetPosition(I: Integer): Integer;
begin
result := A[I].Position;
end;
procedure TPAXSymbolTable.SetStartPosition(I, Value: Integer);
begin
A[I].StartPosition := Value;
end;
function TPAXSymbolTable.GetStartPosition(I: Integer): Integer;
begin
result := A[I].StartPosition;
end;
procedure TPAXSymbolTable.SetLevel(I: Integer; Value: Integer);
begin
if I > 0 then
A[I].Level := Value;
end;
function TPAXSymbolTable.GetLevel(I: Integer): Integer;
begin
if I > 0 then
result := A[I].Level
else if I < 0 then
result := -1
else
result := 0;
end;
procedure TPAXSymbolTable.SetCallConv(I, Value: Integer);
begin
A[I].CallConv := Value;
end;
function TPAXSymbolTable.GetCallConv(I: Integer): Integer;
begin
result := A[I].CallConv;
end;
procedure TPAXSymbolTable.SetTypeNameIndex(I, Value: Integer);
begin
A[I].TypeNameIndex := Value;
end;
function TPAXSymbolTable.GetTypeNameIndex(I: Integer): Integer;
begin
result := A[I].TypeNameIndex;
end;
procedure TPAXSymbolTable.SetType(I, AType: Integer);
begin
if I > 0 then
A[I].PType := AType;
end;
function TPAXSymbolTable.GetType(I: Integer): Integer;
begin
if I > 0 then
result := A[I].PType
else
result := typeVARIANT;
end;
procedure TPAXSymbolTable.SetAddr(I: Integer; Address: Pointer);
begin
A[I].Address := Address;
end;
function TPAXSymbolTable.GetAddr(I: Integer): Pointer;
begin
if I > 0 then
result := A[I].Address
else if I = 0 then
result := @Undefined
else
result := DefinitionList.GetAddress(Scripter, -I);
end;
procedure TPAXSymbolTable.SetByRef(ParamID: Integer; Value: Integer);
begin
A[ParamID].Misc := Value;
end;
function TPAXSymbolTable.GetByRef(ParamID: Integer): Integer;
begin
result := A[ParamID].Misc;
end;
procedure TPAXSymbolTable.SetTypeSub(SubID: Integer; Value: TPAXTypeSub);
begin
A[SubID].Misc := Ord(Value);
end;
function TPAXSymbolTable.GetTypeSub(SubID: Integer): TPAXTypeSub;
var
D: TPaxDefinition;
begin
result := tsNone;
if SubID > 0 then
result := TPAXTypeSub(A[SubID].Misc)
else
begin
D := DefinitionList[-SubID];
if D.DefKind = dkMethod then
result := TPaxMethodDefinition(D).TypeSub;
end;
end;
function TPAXSymbolTable.GetStrType(I: Integer): String;
var
J: Integer;
begin
J := GetType(I);
if (J >= 1) and (J <= Card) then
result := GetName(J)
else if J < 0 then
result := '-' + DefinitionList.GetName(-J)
else
result := ' ';
end;
function TPAXSymbolTable.GetStrVal(I: Integer): String;
begin
if not IsInsideMemAddress(GetAddr(I)) then
result := '***'
else if GetType(I) > 0 then
result := ToStr(Scripter, GetVariant(I))
else
result := '';
end;
function TPAXSymbolTable.GetSizeOf(I: Integer): Integer;
begin
result := _SizeVariant;
end;
function TPAXSymbolTable.AppLabel: Integer;
begin
result := AppVariant(Undefined);
A[result].Kind := KindLABEL;
end;
function TPAXSymbolTable.GetAlias(ID: Integer): Variant;
begin
result := CreateAlias(GetAddr(ID));
end;
function TPAXSymbolTable.GetVariant(ID: Integer): Variant;
begin
if ID > 0 then
result := GetTerminal(GetAddr(ID))^
else if ID = 0 then
begin
end
else
result := DefinitionList.GetVariant(Scripter, -ID);
end;
procedure TPAXSymbolTable.ClearVariant(ID: Integer);
begin
VarClear(Variant(GetAddr(ID)^));
end;
procedure TPAXSymbolTable.ClearVariantValue(ID: Integer);
var
Base: Variant;
SO: TPAXScriptObject;
begin
if GetKind(ID) <> kindREF then
begin
VarClear(Variant(GetAddr(ID)^));
Exit;
end;
Base := GetVariant(ID);
if VarIsNull(Base) or VarIsEmpty(Base) then
raise TPAXScriptFailure.Create(errIncompatibleTypes);
SO := VariantToScriptObject(Base);
SO.ClearProperty(NameIndex[ID]);
end;
procedure TPAXSymbolTable.PutVariant(ID: Integer; const Val: Variant);
begin
if ID > 0 then
GetTerminal(GetAddr(ID))^ := Val
else if ID = 0 then
begin
end
else
DefinitionList.PutVariant(Scripter, -ID, Val);
end;
function TPAXSymbolTable.AppVariant(const Val: Variant; HasAddress: Boolean = true): Integer;
begin
CheckMem;
IncCard;
with A[Card] do
begin
PName := 0;
PType := GetPAXtype(Val);
Kind := kindVAR;
if HasAddress then
begin
Address := Pointer(Integer(Mem) + MemBoundVar);
Inc(MemBoundVar, SizeOf(Variant));
FillChar(Address^, SizeOf(Variant), 0);
Variant(Address^) := Val;
end
else
Address := @Undefined;
Module := -1;
Position := -1;
end;
result := Card;
end;
function TPAXSymbolTable.AppVariantConst(const Val: Variant; Dup: Boolean = false): Integer;
var
R: Double;
I: Integer;
begin
if Dup = false then
begin
result := LookupConstID(Val);
if result > 0 then
Exit;
end;
CheckMem;
if VarType(Val) = varByte then
begin
I := Val;
result := AppVariant(I);
end
else
result := AppVariant(Val);
SetKind(result, KindCONST);
SetName(result, VarToStr(Val));
if GetType(result) = typeDOUBLE then
begin
R := Frac(Val);
if R = 0 then
SetType(result, typeInt64);
end;
end;
function TPAXSymbolTable.AllocateVar(I: Integer): Pointer;
var
MemCnt: Integer;
begin
CheckMem;
result := ShiftPointer(Mem, MemBoundVar);
A[I].Address := result;
MemCnt := GetSizeOf(I);
Inc(MemBoundVar, MemCnt);
FillChar(result^, MemCnt, 0);
end;
procedure TPAXSymbolTable.CheckMem;
begin
if MemBoundVar > MemSize - 256 then
ReallocateMem(MemSize + DeltaMemSize);
end;
procedure TPAXSymbolTable.ReallocateMem(NewSize: Integer);
var
I: Integer;
P, Q, Adr: Pointer;
V: Variant;
K: Integer;
begin
if NewSize = MemSize then
Exit
else if NewSize < MemSize then
begin
// ReallocMem(Mem, NewSize);
// MemSize := NewSize;
Exit;
end;
P := AllocMem(NewSize);
Q := P;
K := 0;
for I:=1 to Card do
begin
Adr := A[I].Address;
if (Adr <> nil) and (Adr <> @Undefined)
and (not TPaxBaseScripter(Scripter).ParamList.HasAddress(Adr)) then
begin
V := Variant(Adr^);
VarClear(Variant(Adr^));
A[I].Address := Q;
if not IsUndefined(V) then
Variant(A[I].Address^) := V;
Inc(Integer(Q), _SizeVariant);
Inc(K, _SizeVariant);
end;
end;
if K > MemBoundVar then
MemBoundVar := K;
FreeMem(Mem, MemSize);
Mem := P;
MemSize := NewSize;
end;
function TPAXSymbolTable.CodeNumberConst(Val: Variant): Integer;
var
I, VT: Integer;
TempVal: Variant;
begin
VT := VarType(Val);
for I:=PAXTypes.Count + 1 to Card do
if GetType(I) > 0 then
if GetKind(I) = kindCONST then
begin
TempVal := GetVariant(I);
if VT = VarType(TempVal) then
if Val = TempVal then
begin
result := I;
Exit;
end;
end;
result := AppVariantConst(Val);
SetName(result, GetStrVal(result));
end;
function TPAXSymbolTable.LookUpID(const Name: String; aLevel: Integer; UpCase: Boolean = true): Integer;
var
I, K: Integer;
S: String;
B: Boolean;
SymbolRec: TPAXSymbolRec;
begin
result := 0;
for I:=Card downto 1 do
begin
SymbolRec := A[I];
if SymbolRec.PName <> 0 then
begin
K := SymbolRec.Kind;
if (K = KindVAR) or (K = KindSUB) or (K = KindTYPE) or
(K = KindLABEL) or
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?