diff options
author | mattias <mattias@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2019-02-16 19:48:10 +0000 |
---|---|---|
committer | mattias <mattias@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2019-02-16 19:48:10 +0000 |
commit | 034f90455d739f6cab8ab858e94e829c4a15cda9 (patch) | |
tree | 60286daef5b195c5e6f7d97ffc6e587edca02594 | |
parent | 86c27dc8489160a68291fdbf3d1006ea1a2eb470 (diff) | |
download | fpc-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.pp | 18 | ||||
-rw-r--r-- | packages/pastojs/tests/tcmodules.pas | 47 |
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); |