2
0
Эх сурвалжийг харах

pastojs: for b in boolean do

git-svn-id: trunk@37770 -
Mattias Gaertner 7 жил өмнө
parent
commit
77e0e9738d

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

@@ -10575,6 +10575,7 @@ type
   TInKind = (
     ikNone,
     ikEnum,
+    ikBool,
     ikChar,
     ikString,
     ikArray
@@ -10711,6 +10712,7 @@ var
           StartInt:=TResEvalRangeInt(InValue).RangeStart;
           EndInt:=TResEvalRangeInt(InValue).RangeEnd;
           HasInVar:=false;
+          HasEndVar:=false;
           case TResEvalRangeInt(InValue).ElKind of
           revskEnum:
             if coEnumNumbers in Options then
@@ -10724,6 +10726,8 @@ var
               end;
           revskChar:
             InKind:=ikChar;
+          revskBool:
+            InKind:=ikBool;
           else
             {$IFDEF VerbosePas2JS}
             writeln('TPasToJSConverter.ConvertForStatement ',GetObjName(El.StartExpr),' InValue=',InValue.AsDebugString);
@@ -10803,6 +10807,16 @@ var
       end;
   end;
 
+  function CreateStrictNotEqual0(Left: TJSElement; PosEl: TPasElement): TJSElement;
+  var
+    SNE: TJSEqualityExpressionSNE;
+  begin
+    SNE:=TJSEqualityExpressionSNE(CreateElement(TJSEqualityExpressionSNE,PosEl));
+    SNE.A:=Left;
+    SNE.B:=CreateLiteralNumber(PosEl,0);
+    Result:=SNE;
+  end;
+
 Var
   ForSt : TJSForStatement;
   List: TJSStatementList;
@@ -10814,7 +10828,6 @@ Var
   FuncContext: TConvertContext;
   PosEl: TPasElement;
   Statements, V: TJSElement;
-  NotEqual: TJSEqualityExpressionNE;
   Call: TJSCallExpression;
   Br: TJSBracketMemberExpression;
 begin
@@ -10911,9 +10924,7 @@ begin
         if StartValue<>nil then
           V:=CreateLiteralNumber(PosEl,StartInt)
         else if El.LoopType=ltIn then
-          case InKind of
-          ikChar, ikString, ikArray: V:=CreateLiteralNumber(PosEl,StartInt);
-          end
+          V:=CreateLiteralNumber(PosEl,StartInt)
         else
           V:=ConvExpr(El.StartExpr);
         V:=CreateVarDecl(CurLoopVarName,V,PosEl);
@@ -10923,13 +10934,14 @@ begin
         begin
         // add "$end=<EndExpr>"
         PosEl:=El.EndExpr;
-        if El.EndExpr=nil then
+        if PosEl=nil then
           PosEl:=El.StartExpr;
         if EndValue<>nil then
           V:=CreateLiteralNumber(PosEl,EndInt)
         else if El.LoopType=ltIn then
           case InKind of
-          ikChar: V:=CreateLiteralNumber(PosEl,EndInt);
+          ikEnum,ikBool,ikChar:
+            V:=CreateLiteralNumber(PosEl,EndInt);
           ikString:
             begin
             // add "$in.length-1"
@@ -10958,7 +10970,7 @@ begin
       end
     else
       begin
-      // for example:
+      // No new vars. For example:
       //   for (VariableName = <startexpr>; VariableName <= <EndExpr>; VariableName++)
       SimpleAss:=TJSSimpleAssignStatement(CreateElement(TJSSimpleAssignStatement,El.VariableName));
       ForSt.Init:=SimpleAss;
@@ -11013,6 +11025,10 @@ begin
         begin
         if InKind<>ikNone then
           case InKind of
+          ikEnum: ;
+          ikBool:
+            // $in!==0;
+            SimpleAss.Expr:=CreateStrictNotEqual0(SimpleAss.Expr,PosEl);
           ikChar:
             // String.fromCharCode($l)
             SimpleAss.Expr:=CreateCallFromCharCode(SimpleAss.Expr,PosEl);
@@ -11050,10 +11066,7 @@ begin
             or ((ResolvedVar.BaseType=btRange) and (ResolvedVar.SubType in btAllBooleans)) then
           begin
           // convert int to bool  ->  $l!=0
-          NotEqual:=TJSEqualityExpressionNE(CreateElement(TJSEqualityExpressionNE,PosEl));
-          NotEqual.A:=SimpleAss.Expr;
-          NotEqual.B:=CreateLiteralNumber(El,0);
-          SimpleAss.Expr:=NotEqual;
+          SimpleAss.Expr:=CreateStrictNotEqual0(SimpleAss.Expr,PosEl);
           end
         end;
       end;

+ 8 - 8
packages/pastojs/tests/tcconverter.pp

@@ -373,7 +373,7 @@ Var
   Cond : TJSRelationalExpressionLE;
   VS: TJSVariableStatement;
   LoopEndVar, LoopVar: String;
-  CS: TJSCommaExpression;
+  VDL: TJSVariableDeclarationList;
 
 begin
   // For I:=1 to 100 do a:=b;
@@ -394,11 +394,11 @@ begin
 
   // "var $l1=1, $le2=100"
   VS:=TJSVariableStatement(AssertElement('For init is var '+LoopEndVar,TJSVariableStatement,ForSt.Init));
-  CS:=TJSCommaExpression(AssertElement('For init var has comma',TJSCommaExpression,VS.A));
-  VD:=TJSVarDeclaration(AssertElement('var '+LoopVar,TJSVarDeclaration,CS.A));
+  VDL:=TJSVariableDeclarationList(AssertElement('For init var has comma',TJSVariableDeclarationList,VS.A));
+  VD:=TJSVarDeclaration(AssertElement('var '+LoopVar,TJSVarDeclaration,VDL.A));
   AssertEquals('Correct name for '+LoopVar,LoopVar,VD.Name);
   AssertLiteral('Correct start value',VD.Init,1);
-  VD:=TJSVarDeclaration(AssertElement('var '+LoopEndVar,TJSVarDeclaration,CS.B));
+  VD:=TJSVarDeclaration(AssertElement('var '+LoopEndVar,TJSVarDeclaration,VDL.B));
   AssertEquals('Correct name for '+LoopEndVar,LoopEndVar,VD.Name);
   AssertLiteral('Correct end value',VD.Init,100);
 
@@ -433,7 +433,7 @@ Var
   Cond: TJSRelationalExpressionGE;
   VS: TJSVariableStatement;
   LoopEndVar, LoopVar: String;
-  CS: TJSCommaExpression;
+  VDL: TJSVariableDeclarationList;
 
 begin
   // For I:=100 downto 1 do a:=b;
@@ -455,11 +455,11 @@ begin
 
   // "var $l1=100, $le2=1"
   VS:=TJSVariableStatement(AssertElement('For init is var '+LoopEndVar,TJSVariableStatement,ForSt.Init));
-  CS:=TJSCommaExpression(AssertElement('For init var has comma',TJSCommaExpression,VS.A));
-  VD:=TJSVarDeclaration(AssertElement('var '+LoopVar,TJSVarDeclaration,CS.A));
+  VDL:=TJSVariableDeclarationList(AssertElement('For init var has comma',TJSVariableDeclarationList,VS.A));
+  VD:=TJSVarDeclaration(AssertElement('var '+LoopVar,TJSVarDeclaration,VDL.A));
   AssertEquals('Correct name for '+LoopVar,LoopVar,VD.Name);
   AssertLiteral('Correct start value',VD.Init,100);
-  VD:=TJSVarDeclaration(AssertElement('var '+LoopEndVar,TJSVarDeclaration,CS.B));
+  VD:=TJSVarDeclaration(AssertElement('var '+LoopEndVar,TJSVarDeclaration,VDL.B));
   AssertEquals('Correct name for '+LoopEndVar,LoopEndVar,VD.Name);
   AssertLiteral('Correct end value',VD.Init,1);
 

+ 7 - 5
packages/pastojs/tests/tcmodules.pas

@@ -4203,14 +4203,16 @@ begin
   'begin',
   '  for b:=false to true do ;',
   '  for b:=b downto false do ;',
+  '  for b in boolean do ;',
   '']);
   ConvertProgram;
   CheckSource('TestForBoolDo',
     LinesToStr([ // statements
     'this.b = false;']),
     LinesToStr([ // this.$main
-    'for (var $l1 = 0; $l1 <= 1; $l1++) $mod.b = $l1 != 0;',
-    'for (var $l2 = +$mod.b; $l2 >= 0; $l2--) $mod.b = $l2 != 0;',
+    'for (var $l1 = 0; $l1 <= 1; $l1++) $mod.b = $l1 !== 0;',
+    'for (var $l2 = +$mod.b; $l2 >= 0; $l2--) $mod.b = $l2 !== 0;',
+    'for (var $l3 = 0; $l3 <= 1; $l3++) $mod.b = $l3 !== 0;',
     '']));
 end;
 
@@ -4699,9 +4701,9 @@ begin
     'this.cr = "a";',
     '']),
     LinesToStr([ // this.$main
-    'for (var ($in1 = $mod.Foo, $l2 = 0), $end3 = $in1.length - 1; $l2 <= $end3; $l2++) $mod.c = $in1.charAt($l2);',
-    'for (var ($in4 = $mod.s, $l5 = 0), $end6 = $in4.length - 1; $l5 <= $end6; $l5++) $mod.c = $in4.charAt($l5);',
-    'for (var $l7 = 0, $end8 = 65535; $l7 <= $end8; $l7++) $mod.c = String.fromCharCode($l7);',
+    'for (var $in1 = $mod.Foo, $l2 = 0, $end3 = $in1.length - 1; $l2 <= $end3; $l2++) $mod.c = $in1.charAt($l2);',
+    'for (var $in4 = $mod.s, $l5 = 0, $end6 = $in4.length - 1; $l5 <= $end6; $l5++) $mod.c = $in4.charAt($l5);',
+    'for (var $l7 = 0; $l7 <= 65535; $l7++) $mod.c = String.fromCharCode($l7);',
     '']));
 end;