Browse Source

pastojs: fixed var-argument setter local var if reference has name v

git-svn-id: trunk@38447 -
Mattias Gaertner 7 years ago
parent
commit
ef016024d5
2 changed files with 40 additions and 2 deletions
  1. 8 2
      packages/pastojs/src/fppas2js.pp
  2. 32 0
      packages/pastojs/tests/tcmodules.pas

+ 8 - 2
packages/pastojs/src/fppas2js.pp

@@ -1545,6 +1545,7 @@ const
   TempRefObjGetterName = 'get';
   TempRefObjSetterName = 'set';
   TempRefObjSetterArgName = 'v';
+  TempRefObjSetterArgNameAlt = 'p';
 
 function CodePointToJSString(u: longword): TJSString;
 begin
@@ -13406,6 +13407,7 @@ var
   GetPath, SetPath: String;
   BracketExpr: TJSBracketMemberExpression;
   DotExpr: TJSDotMemberExpression;
+  SetterArgName: Char;
 begin
   // pass reference -> create a temporary JS object with a FullGetter and setter
   Obj:=nil;
@@ -13415,6 +13417,7 @@ begin
   SetPathExpr:=nil;
   GetExpr:=nil;
   SetExpr:=nil;
+  SetterArgName:=TempRefObjSetterArgName;
   try
     // create FullGetter and setter
     ParamContext.Access:=caByReference;
@@ -13572,7 +13575,10 @@ begin
       // create   SetExpr = v;
       AssignSt:=TJSSimpleAssignStatement(CreateElement(TJSSimpleAssignStatement,El));
       AssignSt.LHS:=SetExpr;
-      AssignSt.Expr:=CreatePrimitiveDotExpr(TempRefObjSetterArgName,El);
+      if (SetExpr is TJSPrimaryExpressionIdent)
+          and (TJSPrimaryExpressionIdent(SetExpr).Name=TJSString(SetterArgName)) then
+        SetterArgName:=TempRefObjSetterArgNameAlt;
+      AssignSt.Expr:=CreatePrimitiveDotExpr(SetterArgName,El);
       SetExpr:=AssignSt;
       end
     else if (SetExpr.ClassType=TJSCallExpression) then
@@ -13601,7 +13607,7 @@ begin
     ObjLit.Name:=TempRefObjSetterName;
     FuncSt:=CreateFunctionSt(El);
     ObjLit.Expr:=FuncSt;
-    FuncSt.AFunction.Params.Add(TempRefObjSetterArgName);
+    FuncSt.AFunction.Params.Add(SetterArgName);
     FuncSt.AFunction.Body.A:=SetExpr;
     SetExpr:=nil;
 

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

@@ -267,6 +267,7 @@ type
     Procedure TestProc_Assembler;
     Procedure TestProc_VarParam;
     Procedure TestProc_VarParamString;
+    Procedure TestProc_VarParamV;
     Procedure TestProc_Overload;
     Procedure TestProc_OverloadForward;
     Procedure TestProc_OverloadUnit;
@@ -2977,6 +2978,37 @@ begin
     ]));
 end;
 
+procedure TTestModule.TestProc_VarParamV;
+begin
+  StartProgram(false);
+  Add([
+  'procedure Inc2(var i: longint);',
+  'begin',
+  '  i:=i+2;',
+  'end;',
+  'procedure DoIt(v: longint);',
+  'begin',
+  '  Inc2(v);',
+  'end;',
+  'begin']);
+  ConvertProgram;
+  CheckSource('TestProc_VarParamV',
+    LinesToStr([ // statements
+    'this.Inc2 = function (i) {',
+    '  i.set(i.get()+2);',
+    '};',
+    'this.DoIt = function (v) {',
+    '  $mod.Inc2({get: function () {',
+    '    return v;',
+    '  }, set: function (p) {',
+    '    v = p;',
+    '  }});',
+    '};',
+    '']),
+    LinesToStr([
+    '']));
+end;
+
 procedure TTestModule.TestProc_Overload;
 begin
   StartProgram(false);