Explorar el Código

pastojs: fixed for e in set do

git-svn-id: trunk@40140 -
Mattias Gaertner hace 6 años
padre
commit
cc44f64920
Se han modificado 2 ficheros con 31 adiciones y 20 borrados
  1. 17 12
      packages/pastojs/src/fppas2js.pp
  2. 14 8
      packages/pastojs/tests/tcmodules.pas

+ 17 - 12
packages/pastojs/src/fppas2js.pp

@@ -1563,6 +1563,7 @@ type
     Function CreateArgumentAccess(Arg: TPasArgument; AContext: TConvertContext;
       PosEl: TPasElement): TJSElement; virtual;
     Function CreateUnary(Members: array of string; E: TJSElement): TJSUnary;
+    Function CreateUnaryPlus(Expr: TJSElement; El: TPasElement): TJSUnaryPlusExpression;
     Function CreateMemberExpression(Members: array of string): TJSDotMemberExpression;
     Function CreateCallExpression(El: TPasElement): TJSCallExpression;
     Function CreateCallCharCodeAt(Arg: TJSElement; aNumber: integer; El: TPasElement): TJSCallExpression; virtual;
@@ -4270,7 +4271,7 @@ var
 begin
   Result:='';
   {$IFDEF VerbosePas2JS}
-  writeln('TPasToJSConverter.ExtractPasStringLiteral S="',S,'" ',RawStrToCaption(S,100),' ',length(S));
+  writeln('TPasToJSConverter.ExtractPasStringLiteral S="',S,'" ',{$IFDEF pas2js}copy(s,100){$ELSE}RawStrToCaption(S,100){$ENDIF},' ',length(S));
   {$ENDIF}
   if S='' then
     RaiseInternalError(20170207154543);
@@ -5519,7 +5520,7 @@ begin
     eopAdd:
       begin
       E:=ConvertElement(El.Operand,AContext);
-      U:=TJSUnaryPlusExpression(CreateElement(TJSUnaryPlusExpression,El));
+      U:=CreateUnaryPlus(E,El);
       U.A:=E;
       end;
     eopSubtract:
@@ -7464,7 +7465,6 @@ var
     Param: TPasExpr;
     JSAdd: TJSAdditiveExpression;
     LowRg: TResEvalValue;
-    JSUnaryPlus: TJSUnaryPlusExpression;
     IsRangeCheck, ok, NeedRangeCheck: Boolean;
     CallEx: TJSCallExpression;
     AssignContext: TAssignContext;
@@ -7525,9 +7525,7 @@ var
                   else
                     begin
                     // -> convert bool to int with unary plus:  +bool
-                    JSUnaryPlus:=TJSUnaryPlusExpression(CreateElement(TJSUnaryPlusExpression,Param));
-                    JSUnaryPlus.A:=Arg;
-                    Arg:=JSUnaryPlus;
+                    Arg:=CreateUnaryPlus(Arg,Param);
                     end;
                   end
                 else
@@ -15770,7 +15768,6 @@ var
   function ConvExpr(Expr: TPasExpr): TJSElement; overload;
   var
     ResolvedEl: TPasResolverResult;
-    JSUnaryPlus: TJSUnaryPlusExpression;
   begin
     Result:=ConvertElement(Expr,AContext);
     if Result is TJSLiteral then
@@ -15803,9 +15800,7 @@ var
           or ((ResolvedEl.BaseType=btRange) and (ResolvedEl.SubType in btAllJSBooleans)) then
         begin
         // convert bool variable to int: +expr
-        JSUnaryPlus:=TJSUnaryPlusExpression(CreateElement(TJSUnaryPlusExpression,Expr));
-        JSUnaryPlus.A:=Result;
-        Result:=JSUnaryPlus;
+        Result:=CreateUnaryPlus(Result,Expr);
         end;
       end;
   end;
@@ -16040,7 +16035,7 @@ var
           else
             InKind:=ikSetInt;
           HasInVar:=false;
-          HasLoopVar:=InKind<>ikSetInt;
+          HasLoopVar:=true;
           HasEndVar:=false;
           exit;
           end
@@ -16324,7 +16319,10 @@ begin
         begin
         if InKind<>ikNone then
           case InKind of
-          ikEnum,ikSetInt: ;
+          ikEnum,ikSetInt:
+            if ForSt.ClassType=TJSForInStatement then
+              // $in=+$l
+              SimpleAss.Expr:=CreateUnaryPlus(SimpleAss.Expr,PosEl);
           ikBool,ikSetBool:
             // $in!==0;
             SimpleAss.Expr:=CreateStrictNotEqual0(SimpleAss.Expr,PosEl);
@@ -16749,6 +16747,13 @@ begin
   Result := unary;
 end;
 
+function TPasToJSConverter.CreateUnaryPlus(Expr: TJSElement; El: TPasElement
+  ): TJSUnaryPlusExpression;
+begin
+  Result:=TJSUnaryPlusExpression(CreateElement(TJSUnaryPlusExpression,El));
+  Result.A:=Expr;
+end;
+
 function TPasToJSConverter.CreateMemberExpression(Members: array of string): TJSDotMemberExpression;
 var
   pex: TJSPrimaryExpressionIdent;

+ 14 - 8
packages/pastojs/tests/tcmodules.pas

@@ -5021,7 +5021,7 @@ begin
   '  for er in TSetOfEnumRg do ;',
   '']);
   ConvertProgram;
-  CheckSource('TestEnumName',
+  CheckSource('TestSet_ForIn',
     LinesToStr([ // statements
     'this.TEnum = {',
     '  "0":"Red",',
@@ -5042,7 +5042,10 @@ begin
     'for ($mod.e = 0; $mod.e <= 1; $mod.e++) $mod.e2 = $mod.e;',
     'for ($mod.e = 1; $mod.e <= 2; $mod.e++) $mod.e2 = $mod.e;',
     'for ($mod.e in rtl.createSet($mod.TEnum.Red, $mod.TEnum.Blue)) $mod.e2 = $mod.e;',
-    'for ($mod.e in $mod.s) $mod.e2 = $mod.e;',
+    'for (var $l1 in $mod.s){',
+    '  $mod.e = +$l1;',
+    '  $mod.e2 = $mod.e;',
+    '};',
     'for ($mod.er = 1; $mod.er <= 2; $mod.er++) ;',
     '']));
 end;
@@ -5757,12 +5760,15 @@ begin
     'for (var $l8 = 11; $l8 <= 13; $l8++) $mod.i = $l8;',
     'for (var $l9 = 0; $l9 <= 255; $l9++) $mod.i = $l9;',
     'for (var $l10 = 3; $l10 <= 7; $l10++) $mod.i = $l10;',
-    'for ($mod.i in $mod.soi) $mod.i2 = $mod.i;',
-    'for (var $l11 = 3; $l11 <= 7; $l11++) $mod.i = $l11;',
-    'for ($mod.i in $mod.soir) ;',
-    'for (var $l12 = 3; $l12 <= 7; $l12++) $mod.ir = $l12;',
-    'for (var $l13 = 3; $l13 <= 7; $l13++) $mod.ir = $l13;',
-    'for ($mod.ir in $mod.soir) ;',
+    'for (var $l11 in $mod.soi) {',
+    '  $mod.i = +$l11;',
+    '  $mod.i2 = $mod.i;',
+    '};',
+    'for (var $l12 = 3; $l12 <= 7; $l12++) $mod.i = $l12;',
+    'for (var $l13 in $mod.soir) $mod.i = +$l13;',
+    'for (var $l14 = 3; $l14 <= 7; $l14++) $mod.ir = $l14;',
+    'for (var $l15 = 3; $l15 <= 7; $l15++) $mod.ir = $l15;',
+    'for (var $l16 in $mod.soir) $mod.ir = +$l16;',
     '']));
 end;