From cc44f649208557d4d8bbff77a31425a5760c6e05 Mon Sep 17 00:00:00 2001 From: Mattias Gaertner Date: Thu, 1 Nov 2018 12:43:39 +0000 Subject: [PATCH] pastojs: fixed for e in set do git-svn-id: trunk@40140 - --- packages/pastojs/src/fppas2js.pp | 29 ++++++++++++++++------------ packages/pastojs/tests/tcmodules.pas | 22 +++++++++++++-------- 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/packages/pastojs/src/fppas2js.pp b/packages/pastojs/src/fppas2js.pp index bbbe29b61b..8ebccf28e2 100644 --- a/packages/pastojs/src/fppas2js.pp +++ b/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; diff --git a/packages/pastojs/tests/tcmodules.pas b/packages/pastojs/tests/tcmodules.pas index 9c2cf2280f..64ae575a1b 100644 --- a/packages/pastojs/tests/tcmodules.pas +++ b/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;