diff options
author | mattias <mattias@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2019-03-06 21:11:21 +0000 |
---|---|---|
committer | mattias <mattias@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2019-03-06 21:11:21 +0000 |
commit | 02403e8bf10b2b33836d9bdc3785de38f5fc9244 (patch) | |
tree | 7800459bb49d465162315f7b587a1d15922529e7 /packages/pastojs | |
parent | dfae477287e3ebdcf0b94a32bbf69eeef7061d5a (diff) | |
download | fpc-02403e8bf10b2b33836d9bdc3785de38f5fc9244.tar.gz |
pastojs: allow typecast extclass to extclass in mode delphi
git-svn-id: https://svn.freepascal.org/svn/fpc/trunk@41623 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'packages/pastojs')
-rw-r--r-- | packages/pastojs/src/fppas2js.pp | 8 | ||||
-rw-r--r-- | packages/pastojs/tests/tcmodules.pas | 38 |
2 files changed, 46 insertions, 0 deletions
diff --git a/packages/pastojs/src/fppas2js.pp b/packages/pastojs/src/fppas2js.pp index 2cf2710051..79264f96e8 100644 --- a/packages/pastojs/src/fppas2js.pp +++ b/packages/pastojs/src/fppas2js.pp @@ -5064,6 +5064,14 @@ begin or IsExternalClass_Name(ToClass,'Object') then // TJSFunction(@Proc) or TJSFunction(ProcVar) exit(cExact); + end + else if FromTypeEl.ClassType=TPasClassType then + begin + if TPasClassType(FromTypeEl).IsExternal + and (msDelphi in CurrentParser.CurrentModeswitches) + and not (bsObjectChecks in CurrentParser.Scanner.CurrentBoolSwitches) then + // ExtClass(ExtClass) -> allow in mode delphi and no objectchecks + exit(cAliasExact); // $mode delphi end; end; end; diff --git a/packages/pastojs/tests/tcmodules.pas b/packages/pastojs/tests/tcmodules.pas index ab5b4d51a0..16a74e49a7 100644 --- a/packages/pastojs/tests/tcmodules.pas +++ b/packages/pastojs/tests/tcmodules.pas @@ -591,6 +591,7 @@ type Procedure TestExternalClass_TypeCastToJSObject; Procedure TestExternalClass_TypeCastStringToExternalString; Procedure TestExternalClass_TypeCastToJSFunction; + Procedure TestExternalClass_TypeCastDelphiUnrelated; Procedure TestExternalClass_CallClassFunctionOfInstanceFail; Procedure TestExternalClass_BracketAccessor; Procedure TestExternalClass_BracketAccessor_Call; @@ -16591,6 +16592,43 @@ begin ''])); end; +procedure TTestModule.TestExternalClass_TypeCastDelphiUnrelated; +begin + StartProgram(false); + Add([ + '{$mode delphi}', + '{$modeswitch externalclass}', + 'type', + ' TJSObject = class external name ''Object'' end;', + ' TJSWindow = class external name ''Window''(TJSObject)', + ' procedure Open;', + ' end;', + ' TJSEventTarget = class external name ''Event''(TJSObject)', + ' procedure Execute;', + ' end;', + 'procedure Fly;', + 'var', + ' w: TJSWindow;', + ' e: TJSEventTarget;', + 'begin', + ' w:=TJSWindow(e);', + ' e:=TJSEventTarget(w);', + 'end;', + 'begin']); + ConvertProgram; + CheckSource('TestExternalClass_TypeCastDelphiUnrelated', + LinesToStr([ // statements + 'this.Fly = function () {', + ' var w = null;', + ' var e = null;', + ' w = e;', + ' e = w;', + '};', + '']), + LinesToStr([ // $mod.$main + ''])); +end; + procedure TTestModule.TestExternalClass_CallClassFunctionOfInstanceFail; begin StartProgram(false); |