Scope cells refactoring
This commit is contained in:
@@ -504,7 +504,7 @@ var
|
||||
begin
|
||||
// The binder has identified the upvalues. Capture the cells from the current scope
|
||||
// using the original source addresses provided by the binder.
|
||||
sourceAddresses := Node.UpvalueSourceAddresses;
|
||||
sourceAddresses := Node.Upvalues;
|
||||
SetLength(capturedCells, Length(sourceAddresses));
|
||||
for i := 0 to High(sourceAddresses) do
|
||||
begin
|
||||
|
||||
@@ -241,14 +241,12 @@ type
|
||||
function GetParameters: TArray<IIdentifierNode>;
|
||||
function GetBody: IExpressionNode;
|
||||
function GetScopeDescriptor: IScopeDescriptor;
|
||||
function GetUpvalues: TArray<IIdentifierNode>;
|
||||
function GetUpvalueSourceAddresses: TArray<TResolvedAddress>;
|
||||
function GetUpvalues: TArray<TResolvedAddress>;
|
||||
{$endregion}
|
||||
property Parameters: TArray<IIdentifierNode> read GetParameters;
|
||||
property Body: IExpressionNode read GetBody;
|
||||
property ScopeDescriptor: IScopeDescriptor read GetScopeDescriptor;
|
||||
property Upvalues: TArray<IIdentifierNode> read GetUpvalues;
|
||||
property UpvalueSourceAddresses: TArray<TResolvedAddress> read GetUpvalueSourceAddresses;
|
||||
property Upvalues: TArray<TResolvedAddress> read GetUpvalues;
|
||||
end;
|
||||
|
||||
IFunctionCallNode = interface(IExpressionNode)
|
||||
|
||||
+6
-22
@@ -187,19 +187,15 @@ type
|
||||
FParameters: TArray<IIdentifierNode>;
|
||||
FBody: IExpressionNode;
|
||||
FScopeDescriptor: IScopeDescriptor;
|
||||
FUpvalues: TArray<IIdentifierNode>;
|
||||
FUpvalueSourceAddresses: TArray<TResolvedAddress>;
|
||||
FUpvalues: TArray<TResolvedAddress>;
|
||||
function GetParameters: TArray<IIdentifierNode>;
|
||||
function GetBody: IExpressionNode;
|
||||
function GetScopeDescriptor: IScopeDescriptor;
|
||||
function GetUpvalues: TArray<IIdentifierNode>;
|
||||
function GetUpvalueSourceAddresses: TArray<TResolvedAddress>;
|
||||
function GetUpvalues: TArray<TResolvedAddress>;
|
||||
public
|
||||
constructor Create(const AParameters: TArray<IIdentifierNode>; const ABody: IExpressionNode);
|
||||
function Accept(const Visitor: IAstVisitor): TAstValue; override;
|
||||
procedure SetUpvalueData(const AUpvalues: TArray<IIdentifierNode>; const ASourceAddresses: TArray<TResolvedAddress>);
|
||||
property ScopeDescriptor: IScopeDescriptor read GetScopeDescriptor;
|
||||
property Upvalues: TArray<IIdentifierNode> read GetUpvalues;
|
||||
end;
|
||||
|
||||
{ TFunctionCallNode }
|
||||
@@ -583,19 +579,12 @@ begin
|
||||
FBody := ABody;
|
||||
FParameters := AParameters;
|
||||
FScopeDescriptor := nil;
|
||||
FUpvalues := [];
|
||||
FUpvalueSourceAddresses := []; // Initialize new field
|
||||
FUpvalues := []; // Initialize new field
|
||||
end;
|
||||
|
||||
function TLambdaExpressionNode.GetUpvalueSourceAddresses: TArray<TResolvedAddress>;
|
||||
function TLambdaExpressionNode.GetUpvalues: TArray<TResolvedAddress>;
|
||||
begin
|
||||
Result := FUpvalueSourceAddresses;
|
||||
end;
|
||||
|
||||
procedure TLambdaExpressionNode.SetUpvalueData(const AUpvalues: TArray<IIdentifierNode>; const ASourceAddresses: TArray<TResolvedAddress>);
|
||||
begin
|
||||
FUpvalues := AUpvalues;
|
||||
FUpvalueSourceAddresses := ASourceAddresses;
|
||||
Result := FUpvalues;
|
||||
end;
|
||||
|
||||
function TLambdaExpressionNode.Accept(const Visitor: IAstVisitor): TAstValue;
|
||||
@@ -618,11 +607,6 @@ begin
|
||||
Result := FScopeDescriptor;
|
||||
end;
|
||||
|
||||
function TLambdaExpressionNode.GetUpvalues: TArray<IIdentifierNode>;
|
||||
begin
|
||||
Result := FUpvalues;
|
||||
end;
|
||||
|
||||
{ TFunctionCallNode }
|
||||
|
||||
constructor TFunctionCallNode.Create(const ACallee: IExpressionNode; const AArguments: array of IExpressionNode);
|
||||
@@ -962,7 +946,7 @@ begin
|
||||
for var i := 0 to High(sortedPairs) do
|
||||
sourceAddresses[i] := sortedPairs[i].Key;
|
||||
|
||||
(Node as TLambdaExpressionNode).SetUpvalueData(upvalueNodes.ToArray, sourceAddresses);
|
||||
(Node as TLambdaExpressionNode).FUpvalues := sourceAddresses;
|
||||
|
||||
upvalueMap.Free;
|
||||
upvalueNodes.Free;
|
||||
|
||||
Reference in New Issue
Block a user