mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-23 14:49:13 +02:00
pastojs: fixed setCharAt, optimize const-1 in charAt and setCharAt
git-svn-id: trunk@37291 -
This commit is contained in:
parent
2ffa1ed9bf
commit
039a7adf1d
@ -4981,16 +4981,44 @@ var
|
|||||||
exit(TResolvedReference(Value.CustomData));
|
exit(TResolvedReference(Value.CustomData));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function ConvertIndexMinus1(Param: TPasExpr): TJSElement;
|
||||||
|
var
|
||||||
|
NeedMinus1: Boolean;
|
||||||
|
JSVal: TJSValue;
|
||||||
|
MinusJS: TJSAdditiveExpressionMinus;
|
||||||
|
begin
|
||||||
|
Result:=ConvertElement(Param,ArgContext);
|
||||||
|
NeedMinus1:=true;
|
||||||
|
if (Result is TJSLiteral) then
|
||||||
|
begin
|
||||||
|
JSVal:=TJSLiteral(Result).Value;
|
||||||
|
if (JSVal.ValueType=jstNumber) then
|
||||||
|
begin
|
||||||
|
// simply subtract 1 from constant
|
||||||
|
JSVal.AsNumber:=JSVal.AsNumber-1;
|
||||||
|
NeedMinus1:=false;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
if NeedMinus1 then
|
||||||
|
begin
|
||||||
|
// index-1
|
||||||
|
MinusJS:=TJSAdditiveExpressionMinus(CreateElement(TJSAdditiveExpressionMinus,Param));
|
||||||
|
MinusJS.A:=Result;
|
||||||
|
MinusJS.B:=CreateLiteralNumber(Param,1);
|
||||||
|
Result:=MinusJS;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure ConvertStringBracket;
|
procedure ConvertStringBracket;
|
||||||
var
|
var
|
||||||
Call: TJSCallExpression;
|
Call: TJSCallExpression;
|
||||||
Param: TPasExpr;
|
Param: TPasExpr;
|
||||||
Expr: TJSAdditiveExpressionMinus;
|
|
||||||
DotExpr: TJSDotMemberExpression;
|
DotExpr: TJSDotMemberExpression;
|
||||||
AssignContext: TAssignContext;
|
AssignContext: TAssignContext;
|
||||||
Elements: TJSArrayLiteralElements;
|
Elements: TJSArrayLiteralElements;
|
||||||
AssignSt: TJSSimpleAssignStatement;
|
AssignSt: TJSSimpleAssignStatement;
|
||||||
OldAccess: TCtxAccess;
|
OldAccess: TCtxAccess;
|
||||||
|
IndexExpr: TJSElement;
|
||||||
begin
|
begin
|
||||||
Param:=El.Params[0];
|
Param:=El.Params[0];
|
||||||
case AContext.Access of
|
case AContext.Access of
|
||||||
@ -5011,8 +5039,9 @@ var
|
|||||||
Call.Expr:=CreateMemberExpression([FBuiltInNames[pbivnRTL],FBuiltInNames[pbifnSetCharAt]]);
|
Call.Expr:=CreateMemberExpression([FBuiltInNames[pbivnRTL],FBuiltInNames[pbifnSetCharAt]]);
|
||||||
// first param s
|
// first param s
|
||||||
Elements.AddElement.Expr:=ConvertElement(El.Value,AContext);
|
Elements.AddElement.Expr:=ConvertElement(El.Value,AContext);
|
||||||
// second param index
|
// second param index-1
|
||||||
Elements.AddElement.Expr:=ConvertElement(Param,ArgContext);
|
IndexExpr:=ConvertIndexMinus1(Param);
|
||||||
|
Elements.AddElement.Expr:=IndexExpr;
|
||||||
AContext.Access:=OldAccess;
|
AContext.Access:=OldAccess;
|
||||||
// third param value
|
// third param value
|
||||||
Elements.AddElement.Expr:=AssignContext.RightSide;
|
Elements.AddElement.Expr:=AssignContext.RightSide;
|
||||||
@ -5036,10 +5065,8 @@ var
|
|||||||
DotExpr.Name:='charAt';
|
DotExpr.Name:='charAt';
|
||||||
|
|
||||||
// add parameter "index-1"
|
// add parameter "index-1"
|
||||||
Expr:=TJSAdditiveExpressionMinus(CreateElement(TJSAdditiveExpressionMinus,Param));
|
IndexExpr:=ConvertIndexMinus1(Param);
|
||||||
Elements.AddElement.Expr:=Expr;
|
Elements.AddElement.Expr:=IndexExpr;
|
||||||
Expr.A:=ConvertElement(Param,ArgContext);
|
|
||||||
Expr.B:=CreateLiteralNumber(Param,1);
|
|
||||||
Result:=Call;
|
Result:=Call;
|
||||||
finally
|
finally
|
||||||
if Result=nil then
|
if Result=nil then
|
||||||
|
@ -4092,7 +4092,7 @@ begin
|
|||||||
Add(' b:= c <> s[1];');
|
Add(' b:= c <> s[1];');
|
||||||
Add(' b:= c > s[1];');
|
Add(' b:= c > s[1];');
|
||||||
Add(' b:= c >= s[1];');
|
Add(' b:= c >= s[1];');
|
||||||
Add(' b:= c < s[1];');
|
Add(' b:= c < s[2];');
|
||||||
Add(' b:= c <= s[1];');
|
Add(' b:= c <= s[1];');
|
||||||
Add(' s[1] := c;');
|
Add(' s[1] := c;');
|
||||||
Add(' s[2+3] := c;');
|
Add(' s[2+3] := c;');
|
||||||
@ -4104,15 +4104,15 @@ begin
|
|||||||
'this.b = false;'
|
'this.b = false;'
|
||||||
]),
|
]),
|
||||||
LinesToStr([ // this.$main
|
LinesToStr([ // this.$main
|
||||||
'$mod.b = $mod.s.charAt(1-1) === $mod.c;',
|
'$mod.b = $mod.s.charAt(0) === $mod.c;',
|
||||||
'$mod.b = $mod.c === $mod.s.charAt(1 - 1);',
|
'$mod.b = $mod.c === $mod.s.charAt(0);',
|
||||||
'$mod.b = $mod.c !== $mod.s.charAt(1 - 1);',
|
'$mod.b = $mod.c !== $mod.s.charAt(0);',
|
||||||
'$mod.b = $mod.c > $mod.s.charAt(1 - 1);',
|
'$mod.b = $mod.c > $mod.s.charAt(0);',
|
||||||
'$mod.b = $mod.c >= $mod.s.charAt(1 - 1);',
|
'$mod.b = $mod.c >= $mod.s.charAt(0);',
|
||||||
'$mod.b = $mod.c < $mod.s.charAt(1 - 1);',
|
'$mod.b = $mod.c < $mod.s.charAt(1);',
|
||||||
'$mod.b = $mod.c <= $mod.s.charAt(1 - 1);',
|
'$mod.b = $mod.c <= $mod.s.charAt(0);',
|
||||||
'$mod.s = rtl.setCharAt($mod.s, 1, $mod.c);',
|
'$mod.s = rtl.setCharAt($mod.s, 0, $mod.c);',
|
||||||
'$mod.s = rtl.setCharAt($mod.s, 2 + 3, $mod.c);',
|
'$mod.s = rtl.setCharAt($mod.s, (2 + 3) - 1, $mod.c);',
|
||||||
'']));
|
'']));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user