pastojs: fixed for e in set do

git-svn-id: trunk@40140 -
This commit is contained in:
Mattias Gaertner 2018-11-01 12:43:39 +00:00
parent db4f11201a
commit cc44f64920
2 changed files with 31 additions and 20 deletions

View File

@ -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;

View File

@ -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;