Browse Source

pastojs: fixed converting index element of external class bracket accessor

git-svn-id: trunk@35917 -
Mattias Gaertner 8 years ago
parent
commit
161ebef6b2

+ 1 - 1
packages/fcl-passrc/src/pasuseanalyzer.pas

@@ -1046,7 +1046,7 @@ begin
     end
     end
   else if C=TArrayValues then
   else if C=TArrayValues then
     begin
     begin
-      Params:=TArrayValues(El).Values;
+    Params:=TArrayValues(El).Values;
     for i:=0 to length(Params)-1 do
     for i:=0 to length(Params)-1 do
       UseExpr(Params[i]);
       UseExpr(Params[i]);
     end
     end

+ 7 - 6
packages/pastojs/src/fppas2js.pp

@@ -125,6 +125,7 @@ Works:
   - function copy(array,start=0,count=max): array
   - function copy(array,start=0,count=max): array
   - procedure insert(item,var array,const position)
   - procedure insert(item,var array,const position)
   - procedure delete(var array,const start,count)
   - procedure delete(var array,const start,count)
+  - const c: dynarray = (a,b,...)
 - static arrays
 - static arrays
   - range: enumtype
   - range: enumtype
   - init as arr = rtl.arrayNewMultiDim([dim1,dim2,...],value)
   - init as arr = rtl.arrayNewMultiDim([dim1,dim2,...],value)
@@ -4982,7 +4983,7 @@ var
 
 
       OldAccess:=ArgContext.Access;
       OldAccess:=ArgContext.Access;
       ArgContext.Access:=caRead;
       ArgContext.Access:=caRead;
-      Bracket.Name:=ConvertElement(El.Params[0],AContext);
+      Bracket.Name:=ConvertElement(El.Params[0],ArgContext);
       ArgContext.Access:=OldAccess;
       ArgContext.Access:=OldAccess;
       ConvertArrayParams:=Bracket;
       ConvertArrayParams:=Bracket;
       Bracket:=nil;
       Bracket:=nil;
@@ -4991,7 +4992,7 @@ var
     end;
     end;
   end;
   end;
 
 
-  procedure ConvertIndexProperty(Prop: TPasProperty; AContext: TConvertContext);
+  procedure ConvertIndexedProperty(Prop: TPasProperty; AContext: TConvertContext);
   var
   var
     Call: TJSCallExpression;
     Call: TJSCallExpression;
     i: Integer;
     i: Integer;
@@ -5046,7 +5047,7 @@ var
         if TargetArg.ValueExpr=nil then
         if TargetArg.ValueExpr=nil then
           begin
           begin
           {$IFDEF VerbosePas2JS}
           {$IFDEF VerbosePas2JS}
-          writeln('TPasToJSConverter.ConvertArrayParams.ConvertIndexProperty missing default value: Prop=',Prop.Name,' i=',i);
+          writeln('TPasToJSConverter.ConvertArrayParams.ConvertIndexedProperty missing default value: Prop=',Prop.Name,' i=',i);
           {$ENDIF}
           {$ENDIF}
           RaiseInconsistency(20170206185126);
           RaiseInconsistency(20170206185126);
           end;
           end;
@@ -5127,7 +5128,7 @@ var
 
 
       DotContext:=TDotContext.Create(El.Value,Left,AContext);
       DotContext:=TDotContext.Create(El.Value,Left,AContext);
       DotContext.LeftResolved:=ResolvedEl;
       DotContext.LeftResolved:=ResolvedEl;
-      ConvertIndexProperty(Prop,DotContext);
+      ConvertIndexedProperty(Prop,DotContext);
       Right:=Result;
       Right:=Result;
       Result:=nil;
       Result:=nil;
     finally
     finally
@@ -5185,7 +5186,7 @@ begin
     ConvertStringBracket
     ConvertStringBracket
   else if (ResolvedEl.IdentEl is TPasProperty)
   else if (ResolvedEl.IdentEl is TPasProperty)
       and (TPasProperty(ResolvedEl.IdentEl).Args.Count>0) then
       and (TPasProperty(ResolvedEl.IdentEl).Args.Count>0) then
-    ConvertIndexProperty(TPasProperty(ResolvedEl.IdentEl),AContext)
+    ConvertIndexedProperty(TPasProperty(ResolvedEl.IdentEl),AContext)
   else if ResolvedEl.BaseType=btContext then
   else if ResolvedEl.BaseType=btContext then
     begin
     begin
     TypeEl:=ResolvedEl.TypeEl;
     TypeEl:=ResolvedEl.TypeEl;
@@ -10503,7 +10504,7 @@ var
 begin
 begin
   Result:='';
   Result:='';
   {$IFDEF VerbosePas2JS}
   {$IFDEF VerbosePas2JS}
-  //writeln('TPasToJSConverter.CreateReferencePath START El=',GetObjName(El),' Parent=',GetObjName(El.Parent),' Context=',GetObjName(AContext),' ',GetObjName(AContext.GetThis));
+  //writeln('TPasToJSConverter.CreateReferencePath START El=',GetObjName(El),' Parent=',GetObjName(El.Parent),' Context=',GetObjName(AContext),' SelfContext=',GetObjName(AContext.GetSelfContext));
   //AContext.WriteStack;
   //AContext.WriteStack;
   {$ENDIF}
   {$ENDIF}
 
 

+ 36 - 1
packages/pastojs/tests/tcmodules.pas

@@ -404,6 +404,7 @@ type
     Procedure TestExternalClass_BracketAccessor_ReadOnly;
     Procedure TestExternalClass_BracketAccessor_ReadOnly;
     Procedure TestExternalClass_BracketAccessor_WriteOnly;
     Procedure TestExternalClass_BracketAccessor_WriteOnly;
     Procedure TestExternalClass_BracketAccessor_MultiType;
     Procedure TestExternalClass_BracketAccessor_MultiType;
+    Procedure TestExternalClass_BracketAccessor_Index;
 
 
     // proc types
     // proc types
     Procedure TestProcType;
     Procedure TestProcType;
@@ -9449,7 +9450,7 @@ begin
   Add('  with arr do items[9]:=items[10];');
   Add('  with arr do items[9]:=items[10];');
   Add('  doit(arr[7],arr[8],arr[9],arr[10]);');
   Add('  doit(arr[7],arr[8],arr[9],arr[10]);');
   ConvertProgram;
   ConvertProgram;
-  CheckSource('TestExternalClass_BracketOperator',
+  CheckSource('TestExternalClass_BracketAccessor',
     LinesToStr([ // statements
     LinesToStr([ // statements
     'this.DoIt = function (vI, vJ, vK, vL) {',
     'this.DoIt = function (vI, vJ, vK, vL) {',
     '};',
     '};',
@@ -9619,6 +9620,40 @@ begin
     '']));
     '']));
 end;
 end;
 
 
+procedure TTestModule.TestExternalClass_BracketAccessor_Index;
+begin
+  StartProgram(false);
+  Add('{$modeswitch externalclass}');
+  Add('type');
+  Add('  TJSArray = class external name ''Array2''');
+  Add('    function GetItems(Index: longint): jsvalue; external name ''[]'';');
+  Add('    procedure SetItems(Index: longint; Value: jsvalue); external name ''[]'';');
+  Add('    property Items[Index: longint]: jsvalue read GetItems write SetItems; default;');
+  Add('  end;');
+  Add('var');
+  Add('  Arr: tjsarray;');
+  Add('  i: longint;');
+  Add('  IntArr: array of longint;');
+  Add('  v: jsvalue;');
+  Add('begin');
+  Add('  v:=arr.items[i];');
+  Add('  arr[longint(v)]:=arr.items[intarr[0]];');
+  Add('  arr.items[intarr[1]]:=arr[IntArr[2]];');
+  ConvertProgram;
+  CheckSource('TestExternalClass_BracketAccessor_Index',
+    LinesToStr([ // statements
+    'this.Arr = null;',
+    'this.i = 0;',
+    'this.IntArr = [];',
+    'this.v = undefined;',
+    '']),
+    LinesToStr([ // $mod.$main
+    '$mod.v = $mod.Arr[$mod.i];',
+    '$mod.Arr[Math.floor($mod.v)] = $mod.Arr[$mod.IntArr[0]];',
+    '$mod.Arr[$mod.IntArr[1]] = $mod.Arr[$mod.IntArr[2]];',
+    '']));
+end;
+
 procedure TTestModule.TestProcType;
 procedure TTestModule.TestProcType;
 begin
 begin
   StartProgram(false);
   StartProgram(false);