From 1fd7fb9da9cc73fcd06d03cd5a6862bfb4e343ee Mon Sep 17 00:00:00 2001 From: Michael Schimmel Date: Tue, 30 Sep 2025 17:41:21 +0200 Subject: [PATCH] Fixed closure upvalue scoping --- Src/AST/Myc.Ast.Binding.pas | 5 ----- Src/AST/Myc.Ast.Scope.pas | 4 +++- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/Src/AST/Myc.Ast.Binding.pas b/Src/AST/Myc.Ast.Binding.pas index f0cc7eb..6cafe7c 100644 --- a/Src/AST/Myc.Ast.Binding.pas +++ b/Src/AST/Myc.Ast.Binding.pas @@ -13,11 +13,6 @@ uses Myc.Ast.Analyzer, Myc.Ast; -//TODO Es gibt hier einen fundamentalen Fehler. Der Binder ist ist in einem Durchlauf nicht in der Lage, Upvalues zu erkennen. -// Wenn in TransformVariableDeclaration eine Variable definiert wird, ist sie grundsätzlich lokal, obwohl sie in einer nested lambda als upvalue benutzt werden könnte. -// Deshalb muss eigentlich zunächst ermittelt werden, wleche variablen später zur upvalue werden. -// Dafür ist Myc.Ast.Analyzer möglicherweise nützlich. - type // The binder is a transformer that enriches the AST with semantic information // like resolved addresses, scopes, and tail-call annotations. diff --git a/Src/AST/Myc.Ast.Scope.pas b/Src/AST/Myc.Ast.Scope.pas index 5898cde..1f263a9 100644 --- a/Src/AST/Myc.Ast.Scope.pas +++ b/Src/AST/Myc.Ast.Scope.pas @@ -35,6 +35,8 @@ type procedure Clear; function Capture(const Address: TResolvedAddress): IValueCell; + function GetNameID(const Name: String): Integer; + function CreateDescriptor: IScopeDescriptor; property Values[const Address: TResolvedAddress]: TDataValue read GetValues write SetValues; default; @@ -101,7 +103,6 @@ type procedure DumpScope(const ABuilder: TStringBuilder; AIndent: Integer); procedure NeedNameToIndex; - function GetNameID(const Name: String): Integer; function GetParent: IExecutionScope; function GetNameToIndex: TDictionary; function GetValues(const Address: TResolvedAddress): TDataValue; @@ -110,6 +111,7 @@ type constructor Create(AParent: IExecutionScope; const ADescriptor: IScopeDescriptor; const ACapturedUpvalues: TArray); destructor Destroy; override; procedure Clear; + function GetNameID(const Name: String): Integer; function Dump: string; procedure Define(const Name: string; const Value: TDataValue); procedure DefineBoxed(const Address: TResolvedAddress; const Value: TDataValue);