Binding
This commit is contained in:
+10
-57
@@ -17,19 +17,13 @@ type
|
||||
procedure DumpScope(const ABuilder: TStringBuilder; AIndent: Integer);
|
||||
function GetValues(const Address: TResolvedAddress): TAstValue;
|
||||
procedure SetValues(const Address: TResolvedAddress; const Value: TAstValue);
|
||||
protected
|
||||
// IExecutionScope
|
||||
function GetParent: IExecutionScope;
|
||||
public
|
||||
constructor Create(AParent: IExecutionScope = nil; const ADescriptor: IScopeDescriptor = nil);
|
||||
destructor Destroy; override;
|
||||
procedure Clear;
|
||||
function FindValue(const Name: string; out Value: TAstValue): Boolean;
|
||||
procedure SetValue(const Name: string; const Value: TAstValue);
|
||||
procedure AssignValue(const Name: string; const Value: TAstValue); overload;
|
||||
function Dump: string;
|
||||
procedure Define(const Name: string; const Value: TAstValue);
|
||||
public
|
||||
constructor Create(AParent: IExecutionScope = nil);
|
||||
constructor CreateFromDescriptor(const AParent: IExecutionScope; const ADescriptor: IScopeDescriptor);
|
||||
destructor Destroy; override;
|
||||
property NameToIndex: TDictionary<string, Integer> read FNameToIndex;
|
||||
property Parent: IExecutionScope read FParent;
|
||||
property Values: TArray<TAstValue> read FValues;
|
||||
@@ -42,20 +36,18 @@ uses
|
||||
|
||||
{ TExecutionScope }
|
||||
|
||||
constructor TExecutionScope.Create(AParent: IExecutionScope);
|
||||
constructor TExecutionScope.Create(AParent: IExecutionScope = nil; const ADescriptor: IScopeDescriptor = nil);
|
||||
begin
|
||||
inherited Create;
|
||||
FParent := AParent;
|
||||
FValues := [];
|
||||
FNameToIndex := TDictionary<string, Integer>.Create;
|
||||
end;
|
||||
|
||||
constructor TExecutionScope.CreateFromDescriptor(const AParent: IExecutionScope; const ADescriptor: IScopeDescriptor);
|
||||
begin
|
||||
inherited Create;
|
||||
FParent := AParent;
|
||||
FNameToIndex := TDictionary<string, Integer>.Create(ADescriptor.Symbols);
|
||||
SetLength(FValues, ADescriptor.SlotCount);
|
||||
if ADescriptor <> nil then
|
||||
begin
|
||||
for var item in ADescriptor.Symbols do
|
||||
FNameToIndex.AddOrSetValue(item.Key, item.Value);
|
||||
SetLength(FValues, ADescriptor.SlotCount);
|
||||
end;
|
||||
end;
|
||||
|
||||
destructor TExecutionScope.Destroy;
|
||||
@@ -69,18 +61,6 @@ begin
|
||||
Result := FParent;
|
||||
end;
|
||||
|
||||
procedure TExecutionScope.AssignValue(const Name: string; const Value: TAstValue);
|
||||
var
|
||||
index: Integer;
|
||||
begin
|
||||
if FNameToIndex.TryGetValue(Name, index) then
|
||||
FValues[index] := Value
|
||||
else if Assigned(FParent) then
|
||||
FParent.AssignValue(Name, Value)
|
||||
else
|
||||
raise Exception.CreateFmt('Cannot assign to undeclared variable "%s".', [Name]);
|
||||
end;
|
||||
|
||||
procedure TExecutionScope.Clear;
|
||||
begin
|
||||
FValues := [];
|
||||
@@ -145,23 +125,6 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
function TExecutionScope.FindValue(const Name: string; out Value: TAstValue): Boolean;
|
||||
var
|
||||
index: Integer;
|
||||
begin
|
||||
if FNameToIndex.TryGetValue(Name, index) then
|
||||
begin
|
||||
Value := FValues[index];
|
||||
Result := True;
|
||||
Exit;
|
||||
end;
|
||||
|
||||
if Assigned(FParent) then
|
||||
Result := FParent.FindValue(Name, Value)
|
||||
else
|
||||
Result := False;
|
||||
end;
|
||||
|
||||
function TExecutionScope.GetValues(const Address: TResolvedAddress): TAstValue;
|
||||
var
|
||||
targetScope: TExecutionScope;
|
||||
@@ -179,16 +142,6 @@ begin
|
||||
Result := targetScope.Values[Address.SlotIndex];
|
||||
end;
|
||||
|
||||
procedure TExecutionScope.SetValue(const Name: string; const Value: TAstValue);
|
||||
var
|
||||
index: Integer;
|
||||
begin
|
||||
if FNameToIndex.TryGetValue(Name, index) then
|
||||
FValues[index] := Value
|
||||
else
|
||||
Define(Name, Value);
|
||||
end;
|
||||
|
||||
procedure TExecutionScope.SetValues(const Address: TResolvedAddress; const Value: TAstValue);
|
||||
var
|
||||
targetScope: IExecutionScope;
|
||||
|
||||
Reference in New Issue
Block a user