Browse Source

pastojs: pass class var to var argument

git-svn-id: trunk@41632 -
Mattias Gaertner 6 years ago
parent
commit
ba36a27d84
2 changed files with 29 additions and 17 deletions
  1. 13 11
      packages/pastojs/src/fppas2js.pp
  2. 16 6
      packages/pastojs/tests/tcmodules.pas

+ 13 - 11
packages/pastojs/src/fppas2js.pp

@@ -8038,16 +8038,18 @@ var
   var
   var
     Call: TJSCallExpression;
     Call: TJSCallExpression;
   begin
   begin
-    if AssignContext=nil then exit;
-    if AssignContext.LeftResolved.LoTypeEl is TPasRecordType then
+    if AssignContext<>nil then
       begin
       begin
-      // aRecord:=right  ->  aRecord.$assign(right)
-      Call:=CreateCallExpression(El);
-      AssignContext.Call:=Call;
-      Call.Expr:=CreateDotNameExpr(El,Result,TJSString(GetBIName(pbifnRecordAssign)));
-      Call.AddArg(AssignContext.RightSide);
-      AssignContext.RightSide:=nil;
-      Result:=Call;
+      if AssignContext.LeftResolved.LoTypeEl is TPasRecordType then
+        begin
+        // aRecord:=right  ->  aRecord.$assign(right)
+        Call:=CreateCallExpression(El);
+        AssignContext.Call:=Call;
+        Call.Expr:=CreateDotNameExpr(El,Result,TJSString(GetBIName(pbifnRecordAssign)));
+        Call.AddArg(AssignContext.RightSide);
+        AssignContext.RightSide:=nil;
+        Result:=Call;
+        end;
       end;
       end;
   end;
   end;
 
 
@@ -8163,8 +8165,8 @@ begin
     end;
     end;
     end; // property redirect
     end; // property redirect
 
 
-  if (AContext.Access=caAssign)
-      and aResolver.IsClassField(Decl) then
+  if aResolver.IsClassField(Decl)
+      and (AContext.Access in [caAssign,caByReference]) then
     begin
     begin
     // writing a class var  -> aClass.VarName
     // writing a class var  -> aClass.VarName
     PathExpr:=CreateReferencePathExpr(Decl.Parent,AContext);
     PathExpr:=CreateReferencePathExpr(Decl.Parent,AContext);

+ 16 - 6
packages/pastojs/tests/tcmodules.pas

@@ -12017,7 +12017,7 @@ begin
   '    class var vI: longint;',
   '    class var vI: longint;',
   '    class var Sub: TObject;',
   '    class var Sub: TObject;',
   '    constructor Create;',
   '    constructor Create;',
-  '    class function GetIt(Par: longint): tobject;',
+  '    class function GetIt(var Par: longint): tobject;',
   '  end;',
   '  end;',
   'constructor tobject.create;',
   'constructor tobject.create;',
   'begin',
   'begin',
@@ -12025,12 +12025,13 @@ begin
   '  Self.vi:=Self.vi+1;',
   '  Self.vi:=Self.vi+1;',
   '  inc(vi);',
   '  inc(vi);',
   'end;',
   'end;',
-  'class function tobject.getit(par: longint): tobject;',
+  'class function tobject.getit(var par: longint): tobject;',
   'begin',
   'begin',
-  '  vi:=vi+par;',
-  '  Self.vi:=Self.vi+par;',
+  '  vi:=vi+3;',
+  '  Self.vi:=Self.vi+4;',
   '  inc(vi);',
   '  inc(vi);',
   '  Result:=self.sub;',
   '  Result:=self.sub;',
+  '  GetIt(vi);',
   'end;',
   'end;',
   'var Obj: tobject;',
   'var Obj: tobject;',
   'begin',
   'begin',
@@ -12058,10 +12059,19 @@ begin
     '  };',
     '  };',
     '  this.GetIt = function(Par){',
     '  this.GetIt = function(Par){',
     '    var Result = null;',
     '    var Result = null;',
-    '    $mod.TObject.vI = this.vI + Par;',
-    '    $mod.TObject.vI = this.vI + Par;',
+    '    $mod.TObject.vI = this.vI + 3;',
+    '    $mod.TObject.vI = this.vI + 4;',
     '    $mod.TObject.vI += 1;',
     '    $mod.TObject.vI += 1;',
     '    Result = this.Sub;',
     '    Result = this.Sub;',
+    '    this.GetIt({',
+    '      p: $mod.TObject,',
+    '      get: function () {',
+    '          return this.p.vI;',
+    '        },',
+    '      set: function (v) {',
+    '          this.p.vI = v;',
+    '        }',
+    '    });',
     '    return Result;',
     '    return Result;',
     '  };',
     '  };',
     '});',
     '});',