소스 검색

pastojs: fixed typecast jsvalue to external class instance not checking if Object

mattias 3 년 전
부모
커밋
261c0ff708
3개의 변경된 파일36개의 추가작업 그리고 25개의 파일을 삭제
  1. 1 1
      packages/pastojs/src/fppas2js.pp
  2. 12 1
      packages/pastojs/tests/tcmodules.pas
  3. 23 23
      packages/pastojs/tests/testpas2js.lpi

+ 1 - 1
packages/pastojs/src/fppas2js.pp

@@ -12136,7 +12136,7 @@ begin
         JSBaseType:=TResElDataPas2JSBaseType(ParamTypeEl.CustomData).JSBaseType;
         if JSBaseType=pbtJSValue then
           begin
-          if (C=TPasClassType)
+          if ((C=TPasClassType) and not TPasClassType(Decl).IsExternal)
               or (C=TPasClassOfType)
               or (C=TPasRecordType) then
             begin

+ 12 - 1
packages/pastojs/tests/tcmodules.pas

@@ -18575,6 +18575,9 @@ begin
   '  end;',
   '  TExtChildB = class external name ''ExtChildB''(TExtRootB)',
   '  end;',
+  '  TExtString = class external name ''String''',
+  '    function charAt(aIndex : NativeInt) : string;',
+  '  end;',
   'var',
   '  Obj: TObject;',
   '  Child: TChild;',
@@ -18583,6 +18586,8 @@ begin
   '  RootB: TExtRootB;',
   '  ChildB: TExtChildB;',
   '  i: IUnknown;',
+  '  s: string;',
+  '  v: jsvalue;',
   'begin',
   '  obj:=tobject(roota);',
   '  obj:=tobject(childa);',
@@ -18592,7 +18597,9 @@ begin
   '  roota:=textroota(rootb);',
   '  roota:=textroota(childb);',
   '  childa:=textchilda(textroota(obj));',
-  '  roota:=TExtRootA(i)',
+  '  roota:=TExtRootA(i);',
+  '  s:=TExtString(s).charAt(7);',
+  '  s:=TExtString(v).charAt(8);',
   '']);
   ConvertProgram;
   CheckSource('TestExternalClass_TypeCastToRootClass',
@@ -18613,6 +18620,8 @@ begin
     'this.RootB = null;',
     'this.ChildB = null;',
     'this.i = null;',
+    'this.s = "";',
+    'this.v = undefined;',
     '']),
     LinesToStr([ // $mod.$main
     '$mod.Obj = $mod.RootA;',
@@ -18624,6 +18633,8 @@ begin
     '$mod.RootA = $mod.ChildB;',
     '$mod.ChildA = $mod.Obj;',
     '$mod.RootA = $mod.i;',
+    '$mod.s = $mod.s.charAt(7);',
+    '$mod.s = $mod.v.charAt(8);',
     '']));
 end;
 

+ 23 - 23
packages/pastojs/tests/testpas2js.lpi

@@ -43,63 +43,63 @@
         <IsPartOfProject Value="True"/>
       </Unit0>
       <Unit1>
-        <Filename Value="tcconverter.pp"/>
+        <Filename Value="../src/fppas2js.pp"/>
         <IsPartOfProject Value="True"/>
+        <UnitName Value="FPPas2Js"/>
       </Unit1>
       <Unit2>
-        <Filename Value="../src/fppas2js.pp"/>
+        <Filename Value="tcmodules.pas"/>
         <IsPartOfProject Value="True"/>
-        <UnitName Value="FPPas2Js"/>
+        <UnitName Value="TCModules"/>
       </Unit2>
       <Unit3>
-        <Filename Value="tcmodules.pas"/>
+        <Filename Value="tcoptimizations.pas"/>
         <IsPartOfProject Value="True"/>
-        <UnitName Value="TCModules"/>
+        <UnitName Value="TCOptimizations"/>
       </Unit3>
       <Unit4>
-        <Filename Value="tcoptimizations.pas"/>
+        <Filename Value="tcsrcmap.pas"/>
         <IsPartOfProject Value="True"/>
-        <UnitName Value="TCOptimizations"/>
+        <UnitName Value="TCSrcMap"/>
       </Unit4>
       <Unit5>
-        <Filename Value="tcsrcmap.pas"/>
+        <Filename Value="../src/fppjssrcmap.pp"/>
         <IsPartOfProject Value="True"/>
-        <UnitName Value="TCSrcMap"/>
+        <UnitName Value="FPPJsSrcMap"/>
       </Unit5>
       <Unit6>
-        <Filename Value="../src/fppjssrcmap.pp"/>
+        <Filename Value="tcfiler.pas"/>
         <IsPartOfProject Value="True"/>
-        <UnitName Value="FPPJsSrcMap"/>
+        <UnitName Value="TCFiler"/>
       </Unit6>
       <Unit7>
-        <Filename Value="tcfiler.pas"/>
+        <Filename Value="../src/pas2jsfiler.pp"/>
         <IsPartOfProject Value="True"/>
-        <UnitName Value="TCFiler"/>
+        <UnitName Value="Pas2JsFiler"/>
       </Unit7>
       <Unit8>
-        <Filename Value="../src/pas2jsfiler.pp"/>
+        <Filename Value="tcunitsearch.pas"/>
         <IsPartOfProject Value="True"/>
-        <UnitName Value="Pas2JsFiler"/>
+        <UnitName Value="TCUnitSearch"/>
       </Unit8>
       <Unit9>
-        <Filename Value="tcunitsearch.pas"/>
+        <Filename Value="tcprecompile.pas"/>
         <IsPartOfProject Value="True"/>
-        <UnitName Value="TCUnitSearch"/>
+        <UnitName Value="TCPrecompile"/>
       </Unit9>
       <Unit10>
-        <Filename Value="tcprecompile.pas"/>
+        <Filename Value="../src/pas2jsuseanalyzer.pp"/>
         <IsPartOfProject Value="True"/>
-        <UnitName Value="TCPrecompile"/>
+        <UnitName Value="Pas2jsUseAnalyzer"/>
       </Unit10>
       <Unit11>
-        <Filename Value="../src/pas2jsuseanalyzer.pp"/>
+        <Filename Value="tcgenerics.pas"/>
         <IsPartOfProject Value="True"/>
-        <UnitName Value="Pas2jsUseAnalyzer"/>
+        <UnitName Value="TCGenerics"/>
       </Unit11>
       <Unit12>
-        <Filename Value="tcgenerics.pas"/>
+        <Filename Value="tcconverter.pas"/>
         <IsPartOfProject Value="True"/>
-        <UnitName Value="TCGenerics"/>
       </Unit12>
     </Units>
   </ProjectOptions>