|
@@ -573,6 +573,7 @@ type
|
|
|
pbifnArray_Static_Clone,
|
|
|
pbifnAs,
|
|
|
pbifnAsExt,
|
|
|
+ pbifnBitwiseLongwordFix,
|
|
|
pbifnBitwiseNativeIntAnd,
|
|
|
pbifnBitwiseNativeIntOr,
|
|
|
pbifnBitwiseNativeIntShl,
|
|
@@ -743,6 +744,7 @@ const
|
|
|
'$clone',
|
|
|
'as', // rtl.as
|
|
|
'asExt', // rtl.asExt
|
|
|
+ 'lw', // pbifnBitwiseLongwordFix
|
|
|
'and', // pbifnBitwiseNativeIntAnd,
|
|
|
'or', // pbifnBitwiseNativeIntOr,
|
|
|
'shl', // pbifnBitwiseNativeIntShl,
|
|
@@ -1949,6 +1951,7 @@ type
|
|
|
Function ConvertCharToInt(Arg: TJSElement; PosEl: TPasElement; ArgContext: TConvertContext): TJSElement; virtual;
|
|
|
Function ConvertIntToInt(Arg: TJSElement; FromBT, ToBT: TResolverBaseType; PosEl: TPasElement; ArgContext: TConvertContext): TJSElement; virtual;
|
|
|
Function CreateBitWiseAnd(El: TPasElement; Value: TJSElement; const Mask: TMaxPrecInt; Shift: integer): TJSElement; virtual;
|
|
|
+ Function CreateBitWiseLongword(El: TPasElement; Value: TJSElement): TJSElement; virtual;
|
|
|
Function ConvertParamsExpr(El: TParamsExpr; AContext: TConvertContext): TJSElement; virtual;
|
|
|
Function ConvertArrayParams(El: TParamsExpr; AContext: TConvertContext): TJSElement; virtual;
|
|
|
Function ConvertFuncParams(El: TParamsExpr; AContext: TConvertContext): TJSElement; virtual;
|
|
@@ -6751,8 +6754,8 @@ function TPasToJSConverter.ConvertUnaryExpression(El: TUnaryExpr;
|
|
|
Var
|
|
|
U : TJSUnaryExpression;
|
|
|
E : TJSElement;
|
|
|
- ResolvedOp, ResolvedEl: TPasResolverResult;
|
|
|
- BitwiseNot: Boolean;
|
|
|
+ ResolvedEl: TPasResolverResult;
|
|
|
+ BitwiseNot, NeedLongWordBitFix: Boolean;
|
|
|
aResolver: TPas2JSResolver;
|
|
|
TypeEl, SubTypeEl: TPasType;
|
|
|
begin
|
|
@@ -6779,13 +6782,18 @@ begin
|
|
|
BitwiseNot:=true;
|
|
|
if aResolver<>nil then
|
|
|
begin
|
|
|
- aResolver.ComputeElement(El.Operand,ResolvedOp,[]);
|
|
|
- BitwiseNot:=ResolvedOp.BaseType in btAllJSInteger;
|
|
|
- end;
|
|
|
+ aResolver.ComputeElement(El.Operand,ResolvedEl,[]);
|
|
|
+ BitwiseNot:=ResolvedEl.BaseType in btAllJSInteger;
|
|
|
+ NeedLongWordBitFix:=ResolvedEl.BaseType=btLongWord;
|
|
|
+ end
|
|
|
+ else
|
|
|
+ NeedLongWordBitFix:=false;
|
|
|
if BitwiseNot then
|
|
|
begin
|
|
|
U:=TJSUnaryInvExpression(CreateElement(TJSUnaryInvExpression,El));
|
|
|
U.A:=E;
|
|
|
+ if NeedLongWordBitFix then
|
|
|
+ exit(CreateBitWiseLongword(El,U));
|
|
|
end
|
|
|
else
|
|
|
U:=CreateUnaryNot(E,El);
|
|
@@ -7053,6 +7061,22 @@ Var
|
|
|
+GetResolverResultDbg(RightResolved));
|
|
|
end;
|
|
|
|
|
|
+ function BitwiseOpNeedLongwordFix: boolean;
|
|
|
+ begin
|
|
|
+ Result:=((LeftResolved.BaseType=btLongWord) and (RightResolved.BaseType<=btLongWord))
|
|
|
+ or ((RightResolved.BaseType=btLongWord) and (LeftResolved.BaseType<=btLongWord));
|
|
|
+ end;
|
|
|
+
|
|
|
+ function CreateBitwiseLongwordOp(A, B: TJSElement; C: TJSBinaryClass): TJSElement;
|
|
|
+ var
|
|
|
+ R: TJSBinary;
|
|
|
+ begin
|
|
|
+ R:=TJSBinary(CreateElement(C,El));
|
|
|
+ R.A:=A;
|
|
|
+ R.B:=B;
|
|
|
+ Result:=CreateBitWiseLongword(El,R);
|
|
|
+ end;
|
|
|
+
|
|
|
var
|
|
|
R : TJSBinary;
|
|
|
C : TJSBinaryClass;
|
|
@@ -7203,16 +7227,23 @@ begin
|
|
|
begin
|
|
|
UseBitwiseOp:=((LeftResolved.BaseType in btAllJSInteger)
|
|
|
or (RightResolved.BaseType in btAllJSInteger));
|
|
|
- if UseBitwiseOp
|
|
|
- and (LeftResolved.BaseType in [btIntDouble,btUIntDouble])
|
|
|
- and (RightResolved.BaseType in [btIntDouble,btUIntDouble]) then
|
|
|
+ if UseBitwiseOp then
|
|
|
begin
|
|
|
- Call:=CreateCallExpression(El);
|
|
|
- Call.Expr:=CreateMemberExpression([GetBIName(pbivnRTL),GetBIName(pbifnBitwiseNativeIntAnd)]);
|
|
|
- Call.AddArg(A);
|
|
|
- Call.AddArg(B);
|
|
|
- Result:=Call;
|
|
|
- exit;
|
|
|
+ if (LeftResolved.BaseType in [btIntDouble,btUIntDouble])
|
|
|
+ and (RightResolved.BaseType in [btIntDouble,btUIntDouble]) then
|
|
|
+ begin
|
|
|
+ Call:=CreateCallExpression(El);
|
|
|
+ Call.Expr:=CreateMemberExpression([GetBIName(pbivnRTL),GetBIName(pbifnBitwiseNativeIntAnd)]);
|
|
|
+ Call.AddArg(A);
|
|
|
+ Call.AddArg(B);
|
|
|
+ Result:=Call;
|
|
|
+ exit;
|
|
|
+ end
|
|
|
+ else if BitwiseOpNeedLongwordFix then
|
|
|
+ begin
|
|
|
+ Result:=CreateBitwiseLongwordOp(A,B,TJSBitwiseAndExpression);
|
|
|
+ exit;
|
|
|
+ end;
|
|
|
end;
|
|
|
end
|
|
|
else
|
|
@@ -7229,16 +7260,23 @@ begin
|
|
|
begin
|
|
|
UseBitwiseOp:=((LeftResolved.BaseType in btAllJSInteger)
|
|
|
or (RightResolved.BaseType in btAllJSInteger));
|
|
|
- if UseBitwiseOp
|
|
|
- and ((LeftResolved.BaseType in [btIntDouble,btUIntDouble])
|
|
|
- or (RightResolved.BaseType in [btIntDouble,btUIntDouble])) then
|
|
|
+ if UseBitwiseOp then
|
|
|
begin
|
|
|
- Call:=CreateCallExpression(El);
|
|
|
- Call.Expr:=CreateMemberExpression([GetBIName(pbivnRTL),GetBIName(pbifnBitwiseNativeIntOr)]);
|
|
|
- Call.AddArg(A);
|
|
|
- Call.AddArg(B);
|
|
|
- Result:=Call;
|
|
|
- exit;
|
|
|
+ if ((LeftResolved.BaseType in [btIntDouble,btUIntDouble])
|
|
|
+ or (RightResolved.BaseType in [btIntDouble,btUIntDouble])) then
|
|
|
+ begin
|
|
|
+ Call:=CreateCallExpression(El);
|
|
|
+ Call.Expr:=CreateMemberExpression([GetBIName(pbivnRTL),GetBIName(pbifnBitwiseNativeIntOr)]);
|
|
|
+ Call.AddArg(A);
|
|
|
+ Call.AddArg(B);
|
|
|
+ Result:=Call;
|
|
|
+ exit;
|
|
|
+ end
|
|
|
+ else if BitwiseOpNeedLongwordFix then
|
|
|
+ begin
|
|
|
+ Result:=CreateBitwiseLongwordOp(A,B,TJSBitwiseOrExpression);
|
|
|
+ exit;
|
|
|
+ end;
|
|
|
end;
|
|
|
end
|
|
|
else
|
|
@@ -7255,16 +7293,23 @@ begin
|
|
|
begin
|
|
|
UseBitwiseOp:=((LeftResolved.BaseType in btAllJSInteger)
|
|
|
or (RightResolved.BaseType in btAllJSInteger));
|
|
|
- if UseBitwiseOp
|
|
|
- and ((LeftResolved.BaseType in [btIntDouble,btUIntDouble])
|
|
|
- or (RightResolved.BaseType in [btIntDouble,btUIntDouble])) then
|
|
|
+ if UseBitwiseOp then
|
|
|
begin
|
|
|
- Call:=CreateCallExpression(El);
|
|
|
- Call.Expr:=CreateMemberExpression([GetBIName(pbivnRTL),GetBIName(pbifnBitwiseNativeIntXor)]);
|
|
|
- Call.AddArg(A);
|
|
|
- Call.AddArg(B);
|
|
|
- Result:=Call;
|
|
|
- exit;
|
|
|
+ if ((LeftResolved.BaseType in [btIntDouble,btUIntDouble])
|
|
|
+ or (RightResolved.BaseType in [btIntDouble,btUIntDouble])) then
|
|
|
+ begin
|
|
|
+ Call:=CreateCallExpression(El);
|
|
|
+ Call.Expr:=CreateMemberExpression([GetBIName(pbivnRTL),GetBIName(pbifnBitwiseNativeIntXor)]);
|
|
|
+ Call.AddArg(A);
|
|
|
+ Call.AddArg(B);
|
|
|
+ Result:=Call;
|
|
|
+ exit;
|
|
|
+ end
|
|
|
+ else if BitwiseOpNeedLongwordFix then
|
|
|
+ begin
|
|
|
+ Result:=CreateBitwiseLongwordOp(A,B,TJSBitwiseXOrExpression);
|
|
|
+ exit;
|
|
|
+ end;
|
|
|
end;
|
|
|
end
|
|
|
else
|
|
@@ -7273,7 +7318,7 @@ begin
|
|
|
if UseBitwiseOp then
|
|
|
C:=TJSBitwiseXOrExpression
|
|
|
else
|
|
|
- C:=TJSBitwiseXOrExpression;
|
|
|
+ C:=TJSBitwiseXOrExpression; // no logical xor in JS. bitwise works for boolean too
|
|
|
end;
|
|
|
eopPower:
|
|
|
begin
|
|
@@ -7513,6 +7558,19 @@ begin
|
|
|
Call.AddArg(A); A:=nil;
|
|
|
Call.AddArg(B); B:=nil;
|
|
|
exit;
|
|
|
+ end
|
|
|
+ else if LeftResolved.BaseType=btLongWord then
|
|
|
+ begin
|
|
|
+ // aLongWord shl b -> rtl.lw(a << b)
|
|
|
+ if El.OpCode=eopShl then
|
|
|
+ JSBinClass:=TJSLShiftExpression
|
|
|
+ else
|
|
|
+ JSBinClass:=TJSURShiftExpression;
|
|
|
+ Result:=TJSBinaryExpression(CreateElement(JSBinClass,El));
|
|
|
+ TJSBinaryExpression(Result).A:=A; A:=nil;
|
|
|
+ TJSBinaryExpression(Result).B:=B; B:=nil;
|
|
|
+ Result:=CreateBitWiseLongword(El,Result);
|
|
|
+ exit;
|
|
|
end;
|
|
|
end
|
|
|
else if (LeftResolved.BaseType=btCurrency) or (RightResolved.BaseType=btCurrency) then
|
|
@@ -8742,6 +8800,17 @@ begin
|
|
|
end;
|
|
|
end;
|
|
|
|
|
|
+function TPasToJSConverter.CreateBitWiseLongword(El: TPasElement;
|
|
|
+ Value: TJSElement): TJSElement;
|
|
|
+var
|
|
|
+ Call: TJSCallExpression;
|
|
|
+begin
|
|
|
+ Call:=CreateCallExpression(El);
|
|
|
+ Call.Expr:=CreatePrimitiveDotExpr(GetBIName(pbivnRTL)+'.'+GetBIName(pbifnBitwiseLongwordFix),El);
|
|
|
+ Call.AddArg(Value);
|
|
|
+ Result:=Call;
|
|
|
+end;
|
|
|
+
|
|
|
function TPasToJSConverter.ConvertInheritedExpr(El: TInheritedExpr;
|
|
|
AContext: TConvertContext): TJSElement;
|
|
|
|