summaryrefslogtreecommitdiff
path: root/packages/pastojs
diff options
context:
space:
mode:
authormattias <mattias@3ad0048d-3df7-0310-abae-a5850022a9f2>2019-03-06 21:11:21 +0000
committermattias <mattias@3ad0048d-3df7-0310-abae-a5850022a9f2>2019-03-06 21:11:21 +0000
commit02403e8bf10b2b33836d9bdc3785de38f5fc9244 (patch)
tree7800459bb49d465162315f7b587a1d15922529e7 /packages/pastojs
parentdfae477287e3ebdcf0b94a32bbf69eeef7061d5a (diff)
downloadfpc-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.pp8
-rw-r--r--packages/pastojs/tests/tcmodules.pas38
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);