瀏覽代碼

pastojs: fixed createcallback inside anonymous method

git-svn-id: trunk@42355 -
Mattias Gaertner 6 年之前
父節點
當前提交
28e07f77e4
共有 2 個文件被更改,包括 18 次插入2 次删除
  1. 8 2
      packages/fcl-passrc/src/pasresolver.pp
  2. 10 0
      packages/pastojs/tests/tcmodules.pas

+ 8 - 2
packages/fcl-passrc/src/pasresolver.pp

@@ -3337,13 +3337,19 @@ end;
 function TPasProcedureScope.GetSelfScope: TPasProcedureScope;
 function TPasProcedureScope.GetSelfScope: TPasProcedureScope;
 var
 var
   Proc: TPasProcedure;
   Proc: TPasProcedure;
+  El: TPasElement;
 begin
 begin
   Result:=Self;
   Result:=Self;
   repeat
   repeat
     if Result.ClassRecScope<>nil then exit;
     if Result.ClassRecScope<>nil then exit;
     Proc:=TPasProcedure(Result.Element);
     Proc:=TPasProcedure(Result.Element);
-    if not (Proc.Parent is TProcedureBody) then exit(nil);
-    Proc:=Proc.Parent.Parent as TPasProcedure;
+    El:=Proc.Parent;
+    repeat
+      if El=nil then exit(nil);
+      if El is TProcedureBody then break;
+      El:=El.Parent;
+    until false;
+    Proc:=El.Parent as TPasProcedure;
     Result:=TPasProcedureScope(Proc.CustomData);
     Result:=TPasProcedureScope(Proc.CustomData);
   until false;
   until false;
 end;
 end;

+ 10 - 0
packages/pastojs/tests/tcmodules.pas

@@ -4799,15 +4799,21 @@ begin
   Add([
   Add([
   'type',
   'type',
   '  TProc = reference to procedure;',
   '  TProc = reference to procedure;',
+  '  TEvent = procedure of object;',
   '  TObject = class',
   '  TObject = class',
   '    Size: word;',
   '    Size: word;',
   '    function GetIt: TProc;',
   '    function GetIt: TProc;',
+  '    procedure DoIt; virtual; abstract;',
   '  end;',
   '  end;',
   'function TObject.GetIt: TProc;',
   'function TObject.GetIt: TProc;',
   'begin',
   'begin',
   '  Result:=procedure',
   '  Result:=procedure',
+  '    var p: TEvent;',
   '    begin',
   '    begin',
   '      Size:=Size;',
   '      Size:=Size;',
+  '      Size:=Self.Size;',
+  '      p:=@DoIt;',
+  '      p:[email protected];',
   '    end;',
   '    end;',
   'end;',
   'end;',
   'begin']);
   'begin']);
@@ -4824,7 +4830,11 @@ begin
     '    var $Self = this;',
     '    var $Self = this;',
     '    var Result = null;',
     '    var Result = null;',
     '    Result = function () {',
     '    Result = function () {',
+    '      var p = null;',
+    '      $Self.Size = $Self.Size;',
     '      $Self.Size = $Self.Size;',
     '      $Self.Size = $Self.Size;',
+    '      p = rtl.createCallback($Self, "DoIt");',
+    '      p = rtl.createCallback($Self, "DoIt");',
     '    };',
     '    };',
     '    return Result;',
     '    return Result;',
     '  };',
     '  };',