|
@@ -290,8 +290,8 @@ Works:
|
|
- for key in JSObject do
|
|
- for key in JSObject do
|
|
- for value in JSArray do
|
|
- for value in JSArray do
|
|
- Assert(bool[,string])
|
|
- Assert(bool[,string])
|
|
- - without sysutils: if(bool) throw string
|
|
|
|
- - with sysutils: if(bool) throw pas.sysutils.EAssertionFailed.$create("Create",[string])
|
|
|
|
|
|
+ - without sysutils: if(!bool) throw string
|
|
|
|
+ - with sysutils: if(!bool) throw pas.sysutils.EAssertionFailed.$create("Create",[string])
|
|
- Object checks:
|
|
- Object checks:
|
|
- Method call EInvalidCast, rtl.checkMethodCall
|
|
- Method call EInvalidCast, rtl.checkMethodCall
|
|
- type cast to class-type and class-of-type, rtl.asExt, EInvalidCast
|
|
- type cast to class-type and class-of-type, rtl.asExt, EInvalidCast
|
|
@@ -1617,6 +1617,7 @@ type
|
|
Function CreateLiteralUndefined(El: TPasElement): TJSLiteral; virtual;
|
|
Function CreateLiteralUndefined(El: TPasElement): TJSLiteral; virtual;
|
|
Function CreateLiteralCustomValue(El: TPasElement; const s: TJSString): TJSLiteral; virtual;
|
|
Function CreateLiteralCustomValue(El: TPasElement; const s: TJSString): TJSLiteral; virtual;
|
|
Function CreateSetLiteralElement(Expr: TPasExpr; AContext: TConvertContext): TJSElement; virtual;
|
|
Function CreateSetLiteralElement(Expr: TPasExpr; AContext: TConvertContext): TJSElement; virtual;
|
|
|
|
+ Function CreateUnaryNot(El: TJSElement; Src: TPasElement): TJSUnaryNotExpression; virtual;
|
|
Procedure ConvertCharLiteralToInt(Lit: TJSLiteral; ErrorEl: TPasElement; AContext: TConvertContext); virtual;
|
|
Procedure ConvertCharLiteralToInt(Lit: TJSLiteral; ErrorEl: TPasElement; AContext: TConvertContext); virtual;
|
|
Function ClonePrimaryExpression(El: TJSPrimaryExpression; Src: TPasElement): TJSPrimaryExpression;
|
|
Function ClonePrimaryExpression(El: TJSPrimaryExpression; Src: TPasElement): TJSPrimaryExpression;
|
|
// simple JS expressions
|
|
// simple JS expressions
|
|
@@ -5822,10 +5823,12 @@ begin
|
|
BitwiseNot:=ResolvedOp.BaseType in btAllJSInteger;
|
|
BitwiseNot:=ResolvedOp.BaseType in btAllJSInteger;
|
|
end;
|
|
end;
|
|
if BitwiseNot then
|
|
if BitwiseNot then
|
|
- U:=TJSUnaryInvExpression(CreateElement(TJSUnaryInvExpression,El))
|
|
|
|
|
|
+ begin
|
|
|
|
+ U:=TJSUnaryInvExpression(CreateElement(TJSUnaryInvExpression,El));
|
|
|
|
+ U.A:=E;
|
|
|
|
+ end
|
|
else
|
|
else
|
|
- U:=TJSUnaryNotExpression(CreateElement(TJSUnaryNotExpression,El));
|
|
|
|
- U.A:=E;
|
|
|
|
|
|
+ U:=CreateUnaryNot(E,El);
|
|
end;
|
|
end;
|
|
eopAddress:
|
|
eopAddress:
|
|
begin
|
|
begin
|
|
@@ -6294,7 +6297,6 @@ function TPasToJSConverter.ConvertBinaryExpressionRes(El: TBinaryExpr;
|
|
function CreateEqualCallback: TJSElement;
|
|
function CreateEqualCallback: TJSElement;
|
|
var
|
|
var
|
|
Call: TJSCallExpression;
|
|
Call: TJSCallExpression;
|
|
- NotEl: TJSUnaryNotExpression;
|
|
|
|
begin
|
|
begin
|
|
// convert "proctypeA = proctypeB" to "rtl.eqCallback(proctypeA,proctypeB)"
|
|
// convert "proctypeA = proctypeB" to "rtl.eqCallback(proctypeA,proctypeB)"
|
|
Call:=CreateCallExpression(El);
|
|
Call:=CreateCallExpression(El);
|
|
@@ -6306,9 +6308,7 @@ function TPasToJSConverter.ConvertBinaryExpressionRes(El: TBinaryExpr;
|
|
if El.OpCode=eopNotEqual then
|
|
if El.OpCode=eopNotEqual then
|
|
begin
|
|
begin
|
|
// convert "proctypeA <> proctypeB" to "!rtl.eqCallback(proctypeA,proctypeB)"
|
|
// convert "proctypeA <> proctypeB" to "!rtl.eqCallback(proctypeA,proctypeB)"
|
|
- NotEl:=TJSUnaryNotExpression(CreateElement(TJSUnaryNotExpression,El));
|
|
|
|
- NotEl.A:=Call;
|
|
|
|
- Result:=NotEl;
|
|
|
|
|
|
+ Result:=CreateUnaryNot(Call,El);
|
|
end
|
|
end
|
|
else
|
|
else
|
|
Result:=Call;
|
|
Result:=Call;
|
|
@@ -6329,7 +6329,6 @@ var
|
|
FunName: String;
|
|
FunName: String;
|
|
Call: TJSCallExpression;
|
|
Call: TJSCallExpression;
|
|
DotExpr: TJSDotMemberExpression;
|
|
DotExpr: TJSDotMemberExpression;
|
|
- NotEl: TJSUnaryNotExpression;
|
|
|
|
InOp: TJSRelationalExpressionIn;
|
|
InOp: TJSRelationalExpressionIn;
|
|
TypeEl, LeftTypeEl, RightTypeEl: TPasType;
|
|
TypeEl, LeftTypeEl, RightTypeEl: TPasType;
|
|
SNE: TJSEqualityExpressionSNE;
|
|
SNE: TJSEqualityExpressionSNE;
|
|
@@ -6652,11 +6651,7 @@ begin
|
|
Call.AddArg(A);
|
|
Call.AddArg(A);
|
|
A:=nil;
|
|
A:=nil;
|
|
if El.OpCode=eopNotEqual then
|
|
if El.OpCode=eopNotEqual then
|
|
- begin
|
|
|
|
- NotEl:=TJSUnaryNotExpression(CreateElement(TJSUnaryNotExpression,El));
|
|
|
|
- NotEl.A:=Call;
|
|
|
|
- Result:=NotEl;
|
|
|
|
- end
|
|
|
|
|
|
+ Result:=CreateUnaryNot(Call,El)
|
|
else
|
|
else
|
|
Result:=Call;
|
|
Result:=Call;
|
|
exit;
|
|
exit;
|
|
@@ -6692,9 +6687,7 @@ begin
|
|
if El.OpCode=eopNotEqual then
|
|
if El.OpCode=eopNotEqual then
|
|
begin
|
|
begin
|
|
// convert "recordA <> recordB" to "!recordA.$equal(recordB)"
|
|
// convert "recordA <> recordB" to "!recordA.$equal(recordB)"
|
|
- NotEl:=TJSUnaryNotExpression(CreateElement(TJSUnaryNotExpression,El));
|
|
|
|
- NotEl.A:=Call;
|
|
|
|
- Result:=NotEl;
|
|
|
|
|
|
+ Result:=CreateUnaryNot(Call,El);
|
|
end
|
|
end
|
|
else
|
|
else
|
|
Result:=Call;
|
|
Result:=Call;
|
|
@@ -6715,11 +6708,7 @@ begin
|
|
Call.AddArg(B);
|
|
Call.AddArg(B);
|
|
B:=nil;
|
|
B:=nil;
|
|
if El.OpCode=eopNotEqual then
|
|
if El.OpCode=eopNotEqual then
|
|
- begin
|
|
|
|
- NotEl:=TJSUnaryNotExpression(CreateElement(TJSUnaryNotExpression,El));
|
|
|
|
- NotEl.A:=Call;
|
|
|
|
- Result:=NotEl;
|
|
|
|
- end
|
|
|
|
|
|
+ Result:=CreateUnaryNot(Call,El)
|
|
else
|
|
else
|
|
Result:=Call;
|
|
Result:=Call;
|
|
exit;
|
|
exit;
|
|
@@ -6739,11 +6728,7 @@ begin
|
|
Call.AddArg(B);
|
|
Call.AddArg(B);
|
|
B:=nil;
|
|
B:=nil;
|
|
if El.OpCode=eopNotEqual then
|
|
if El.OpCode=eopNotEqual then
|
|
- begin
|
|
|
|
- NotEl:=TJSUnaryNotExpression(CreateElement(TJSUnaryNotExpression,El));
|
|
|
|
- NotEl.A:=Call;
|
|
|
|
- Result:=NotEl;
|
|
|
|
- end
|
|
|
|
|
|
+ Result:=CreateUnaryNot(Call,El)
|
|
else
|
|
else
|
|
Result:=Call;
|
|
Result:=Call;
|
|
exit;
|
|
exit;
|
|
@@ -6778,11 +6763,7 @@ begin
|
|
Call.AddArg(A);
|
|
Call.AddArg(A);
|
|
A:=nil;
|
|
A:=nil;
|
|
if El.OpCode=eopNotEqual then
|
|
if El.OpCode=eopNotEqual then
|
|
- begin
|
|
|
|
- NotEl:=TJSUnaryNotExpression(CreateElement(TJSUnaryNotExpression,El));
|
|
|
|
- NotEl.A:=Call;
|
|
|
|
- Result:=NotEl;
|
|
|
|
- end
|
|
|
|
|
|
+ Result:=CreateUnaryNot(Call,El)
|
|
else
|
|
else
|
|
Result:=Call;
|
|
Result:=Call;
|
|
exit;
|
|
exit;
|
|
@@ -10702,7 +10683,8 @@ begin
|
|
IfSt:=TJSIfStatement(CreateElement(TJSIfStatement,El));
|
|
IfSt:=TJSIfStatement(CreateElement(TJSIfStatement,El));
|
|
try
|
|
try
|
|
PosEl:=El.Params[0];
|
|
PosEl:=El.Params[0];
|
|
- IfSt.Cond:=ConvertExpression(El.Params[0],AContext);
|
|
|
|
|
|
+ IfSt.Cond:=CreateUnaryNot(ConvertExpression(PosEl,AContext),PosEl);
|
|
|
|
+
|
|
ThrowSt:=TJSThrowStatement(CreateElement(TJSThrowStatement,PosEl));
|
|
ThrowSt:=TJSThrowStatement(CreateElement(TJSThrowStatement,PosEl));
|
|
IfSt.BTrue:=ThrowSt;
|
|
IfSt.BTrue:=ThrowSt;
|
|
|
|
|
|
@@ -11425,8 +11407,8 @@ Var
|
|
IfSt:=TJSIfStatement(CreateElement(TJSIfStatement,ProcBody));
|
|
IfSt:=TJSIfStatement(CreateElement(TJSIfStatement,ProcBody));
|
|
AddFunctionFinallySt(IfSt,ProcBody,FuncContext);
|
|
AddFunctionFinallySt(IfSt,ProcBody,FuncContext);
|
|
// !$ok
|
|
// !$ok
|
|
- IfSt.Cond:=TJSUnaryNotExpression(CreateElement(TJSUnaryNotExpression,ProcBody));
|
|
|
|
- TJSUnaryNotExpression(IfSt.Cond).A:=CreatePrimitiveDotExpr(FBuiltInNames[pbivnProcOk],ProcBody);
|
|
|
|
|
|
+ IfSt.Cond:=CreateUnaryNot(
|
|
|
|
+ CreatePrimitiveDotExpr(FBuiltInNames[pbivnProcOk],ProcBody),ProcBody);
|
|
// rtl._Release(Result)
|
|
// rtl._Release(Result)
|
|
Call:=CreateCallExpression(ProcBody);
|
|
Call:=CreateCallExpression(ProcBody);
|
|
IfSt.BTrue:=Call;
|
|
IfSt.BTrue:=Call;
|
|
@@ -16057,7 +16039,6 @@ function TPasToJSConverter.ConvertRepeatStatement(El: TPasImplRepeatUntil;
|
|
// do{implblock}while(!untilcondition);
|
|
// do{implblock}while(!untilcondition);
|
|
var
|
|
var
|
|
C : TJSElement;
|
|
C : TJSElement;
|
|
- N : TJSUnaryNotExpression;
|
|
|
|
W : TJSDoWhileStatement;
|
|
W : TJSDoWhileStatement;
|
|
B : TJSElement;
|
|
B : TJSElement;
|
|
begin
|
|
begin
|
|
@@ -16077,11 +16058,7 @@ begin
|
|
B:=nil;
|
|
B:=nil;
|
|
end
|
|
end
|
|
else
|
|
else
|
|
- begin
|
|
|
|
- N:=TJSUnaryNotExpression(CreateElement(TJSUnaryNotExpression,El.ConditionExpr));
|
|
|
|
- N.A:=C;
|
|
|
|
- C:=N;
|
|
|
|
- end;
|
|
|
|
|
|
+ C:=CreateUnaryNot(C,El.ConditionExpr);
|
|
B:=ConvertImplBlockElements(El,AContext,false);
|
|
B:=ConvertImplBlockElements(El,AContext,false);
|
|
W:=TJSDoWhileStatement(CreateElement(TJSDoWhileStatement,El));
|
|
W:=TJSDoWhileStatement(CreateElement(TJSDoWhileStatement,El));
|
|
W.Cond:=C;
|
|
W.Cond:=C;
|
|
@@ -17599,6 +17576,13 @@ begin
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+function TPasToJSConverter.CreateUnaryNot(El: TJSElement; Src: TPasElement
|
|
|
|
+ ): TJSUnaryNotExpression;
|
|
|
|
+begin
|
|
|
|
+ Result:=TJSUnaryNotExpression(CreateElement(TJSUnaryNotExpression,Src));
|
|
|
|
+ Result.A:=El;
|
|
|
|
+end;
|
|
|
|
+
|
|
procedure TPasToJSConverter.ConvertCharLiteralToInt(Lit: TJSLiteral;
|
|
procedure TPasToJSConverter.ConvertCharLiteralToInt(Lit: TJSLiteral;
|
|
ErrorEl: TPasElement; AContext: TConvertContext);
|
|
ErrorEl: TPasElement; AContext: TConvertContext);
|
|
var
|
|
var
|