summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormattias <mattias@3ad0048d-3df7-0310-abae-a5850022a9f2>2019-02-16 19:48:10 +0000
committermattias <mattias@3ad0048d-3df7-0310-abae-a5850022a9f2>2019-02-16 19:48:10 +0000
commit034f90455d739f6cab8ab858e94e829c4a15cda9 (patch)
tree60286daef5b195c5e6f7d97ffc6e587edca02594
parent86c27dc8489160a68291fdbf3d1006ea1a2eb470 (diff)
downloadfpc-034f90455d739f6cab8ab858e94e829c4a15cda9.tar.gz
pastojs: fixed typecast jsvalue(anobject/interface)
git-svn-id: https://svn.freepascal.org/svn/fpc/trunk@41346 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r--packages/pastojs/src/fppas2js.pp18
-rw-r--r--packages/pastojs/tests/tcmodules.pas47
2 files changed, 47 insertions, 18 deletions
diff --git a/packages/pastojs/src/fppas2js.pp b/packages/pastojs/src/fppas2js.pp
index d06013488b..92f09c9f96 100644
--- a/packages/pastojs/src/fppas2js.pp
+++ b/packages/pastojs/src/fppas2js.pp
@@ -1218,7 +1218,7 @@ const
btIntDouble,btUIntDouble,
btCurrency // in pas2js currency is more like an integer, instead of float
];
- btAllJSValueSrcTypes = [btNil,btUntyped,btPointer]+btAllJSInteger
+ btAllJSValueSrcTypes = [btNil,btUntyped,btPointer,btSet]+btAllJSInteger
+btAllJSStringAndChars+btAllJSFloats+btAllJSBooleans;
btAllJSValueTypeCastTo = btAllJSInteger
+btAllJSStringAndChars+btAllJSFloats+btAllJSBooleans+[btPointer];
@@ -9808,8 +9808,6 @@ var
Call: TJSCallExpression;
NotExpr: TJSUnaryNotExpression;
AddExpr: TJSAdditiveExpressionPlus;
- TypeEl: TPasType;
- C: TClass;
Int: TMaxPrecInt;
aResolver: TPas2JSResolver;
begin
@@ -10072,20 +10070,6 @@ begin
begin
// type cast to jsvalue
Result:=ConvertExpression(Param,AContext);
- // Note: convert value first in case it raises an exception
- if ParamResolved.BaseType=btContext then
- begin
- TypeEl:=ParamResolved.LoTypeEl;
- C:=TypeEl.ClassType;
- if (C=TPasClassType) or (C=TPasRecordType) then
- begin
- // TObject(jsvalue) -> rtl.getObject(jsvalue)
- Call:=CreateCallExpression(El);
- Call.Expr:=CreateMemberExpression([GetBIName(pbivnRTL),GetBIName(pbifnGetObject)]);
- Call.AddArg(Result);
- Result:=Call;
- end;
- end;
exit;
end;
end;
diff --git a/packages/pastojs/tests/tcmodules.pas b/packages/pastojs/tests/tcmodules.pas
index a57626deb7..8c2ce1722c 100644
--- a/packages/pastojs/tests/tcmodules.pas
+++ b/packages/pastojs/tests/tcmodules.pas
@@ -720,6 +720,7 @@ type
// jsvalue
Procedure TestJSValue_AssignToJSValue;
Procedure TestJSValue_TypeCastToBaseType;
+ Procedure TestJSValue_TypecastToJSValue;
Procedure TestJSValue_Equal;
Procedure TestJSValue_If;
Procedure TestJSValue_Not;
@@ -17428,7 +17429,7 @@ begin
'$mod.v = $mod.IntfVar;',
'$mod.IntfVar = rtl.getObject($mod.v);',
'if (rtl.isExt($mod.v, $mod.IBird, 1)) ;',
- '$mod.v = rtl.getObject($mod.IntfVar);',
+ '$mod.v = $mod.IntfVar;',
'$mod.v = $mod.IBird;',
'']));
end;
@@ -24882,6 +24883,50 @@ begin
'']));
end;
+procedure TTestModule.TestJSValue_TypecastToJSValue;
+begin
+ StartProgram(false);
+ Add([
+ 'type',
+ ' TArr = array of word;',
+ ' TRec = record end;',
+ ' TSet = set of boolean;',
+ 'procedure Fly(v: jsvalue);',
+ 'begin',
+ 'end;',
+ 'var',
+ ' a: TArr;',
+ ' r: TRec;',
+ ' s: TSet;',
+ 'begin',
+ ' Fly(jsvalue(a));',
+ ' Fly(jsvalue(r));',
+ ' Fly(jsvalue(s));',
+ '']);
+ ConvertProgram;
+ CheckSource('TestJSValue_TypecastToJSValue',
+ LinesToStr([ // statements
+ 'rtl.recNewT($mod, "TRec", function () {',
+ ' this.$eq = function (b) {',
+ ' return true;',
+ ' };',
+ ' this.$assign = function (s) {',
+ ' return this;',
+ ' };',
+ '});',
+ 'this.Fly = function (v) {',
+ '};',
+ 'this.a = [];',
+ 'this.r = $mod.TRec.$new();',
+ 'this.s = {};',
+ '']),
+ LinesToStr([ // $mod.$main
+ '$mod.Fly($mod.a);',
+ '$mod.Fly($mod.r);',
+ '$mod.Fly($mod.s);',
+ '']));
+end;
+
procedure TTestModule.TestJSValue_Equal;
begin
StartProgram(false);