Binder refactoring - extracted type checking

This commit is contained in:
Michael Schimmel
2025-11-01 14:14:17 +01:00
parent 6826b75c19
commit 734b7b1d5e
2 changed files with 68 additions and 95 deletions
+6 -24
View File
@@ -25,12 +25,7 @@ type
TAstBinder = class(TAstTransformer, IAstBinder)
private
type
TUpvalueMapping = class
public
Map: TDictionary<TResolvedAddress, Integer>;
constructor Create;
destructor Destroy; override;
end;
TUpvalueMapping = TDictionary<TResolvedAddress, Integer>;
private
FInitialScope: IExecutionScope;
FCurrentDescriptor: IScopeDescriptor;
@@ -110,19 +105,6 @@ begin
Result := Result * 23 + Value.SlotIndex;
end;
{ TAstBinder.TUpvalueMapping }
constructor TAstBinder.TUpvalueMapping.Create;
begin
inherited Create;
Map := TDictionary<TResolvedAddress, Integer>.Create(TResolvedAddressComparer.Create);
end;
destructor TAstBinder.TUpvalueMapping.Destroy;
begin
Map.Free;
inherited Destroy;
end;
{ TAstBinder }
constructor TAstBinder.Create(const AInitialScope: IExecutionScope);
@@ -501,7 +483,7 @@ var
lastNestedLambdaCount: Integer;
boundLambda: ILambdaExpressionNode;
begin
FUpvalueStack.Push(TUpvalueMapping.Create);
FUpvalueStack.Push(TUpvalueMapping.Create(TResolvedAddressComparer.Create));
try
EnterScope;
try
@@ -529,7 +511,7 @@ begin
// Upvalue mapping extraction remains the same
var upvalueMapping := FUpvalueStack.Peek;
var sortedPairs := upvalueMapping.Map.ToArray;
var sortedPairs := upvalueMapping.ToArray;
TArray.Sort<TPair<TResolvedAddress, Integer>>(
sortedPairs,
TComparer<TPair<TResolvedAddress, Integer>>.Construct(
@@ -610,10 +592,10 @@ begin
var upvalue := FUpvalueStack.Peek;
dec(adr.ScopeDepth); // Adjust address to be relative to the lambda's parent
var upvalueIndex: Integer;
if not upvalue.Map.TryGetValue(adr, upvalueIndex) then
if not upvalue.TryGetValue(adr, upvalueIndex) then
begin
upvalueIndex := upvalue.Map.Count;
upvalue.Map.Add(adr, upvalueIndex);
upvalueIndex := upvalue.Count;
upvalue.Add(adr, upvalueIndex);
end;
boundNode := TBoundIdentifierNode.Create(Node, TResolvedAddress.Create(akUpvalue, 0, upvalueIndex));
end