pastojs: typecast array to/from tjsobject

git-svn-id: trunk@39034 -
This commit is contained in:
Mattias Gaertner 2018-05-20 10:40:07 +00:00
parent 8364b1f4ca
commit 763fd783e0
3 changed files with 43 additions and 26 deletions

View File

@ -3984,8 +3984,9 @@ begin
FromTypeEl:=FromResolved.LoTypeEl; FromTypeEl:=FromResolved.LoTypeEl;
if FromTypeEl.ClassType=TPasArrayType then if FromTypeEl.ClassType=TPasArrayType then
begin begin
if IsExternalClassName(ToClass,'Array') then if IsExternalClassName(ToClass,'Array')
// TJSArray(AnArray) or IsExternalClassName(ToClass,'Object') then
// TJSArray(AnArray) or TJSObject(AnArray)
exit(cExact); exit(cExact);
end end
else if FromTypeEl.ClassType=TPasRecordType then else if FromTypeEl.ClassType=TPasRecordType then
@ -4010,9 +4011,10 @@ begin
FromTypeEl:=FromResolved.LoTypeEl; FromTypeEl:=FromResolved.LoTypeEl;
if (FromTypeEl.ClassType=TPasClassType) if (FromTypeEl.ClassType=TPasClassType)
and TPasClassType(FromTypeEl).IsExternal and TPasClassType(FromTypeEl).IsExternal
and IsExternalClassName(TPasClassType(FromTypeEl),'Array') then and (IsExternalClassName(TPasClassType(FromTypeEl),'Array')
or IsExternalClassName(TPasClassType(FromTypeEl),'Object')) then
begin begin
// type cast external Array to an array // type cast external Array/Object to an array
exit(cCompatible); exit(cCompatible);
end; end;
end; end;

View File

@ -394,8 +394,8 @@ type
Procedure TestArray_InsertDelete; Procedure TestArray_InsertDelete;
Procedure TestArray_DynArrayConst; Procedure TestArray_DynArrayConst;
Procedure TestArray_ForInArrOfString; Procedure TestArray_ForInArrOfString;
Procedure TestExternalClass_TypeCastArrayToExternalArray; Procedure TestExternalClass_TypeCastArrayToExternalClass;
Procedure TestExternalClass_TypeCastArrayFromExternalArray; Procedure TestExternalClass_TypeCastArrayFromExternalClass;
// record // record
Procedure TestRecord_Empty; Procedure TestRecord_Empty;
@ -7649,12 +7649,14 @@ begin
''])); '']));
end; end;
procedure TTestModule.TestExternalClass_TypeCastArrayToExternalArray; procedure TTestModule.TestExternalClass_TypeCastArrayToExternalClass;
begin begin
StartProgram(false); StartProgram(false);
Add([ Add([
'{$modeswitch externalclass}', '{$modeswitch externalclass}',
'type', 'type',
' TJSObject = class external name ''Object''',
' end;',
' TJSArray = class external name ''Array''', ' TJSArray = class external name ''Array''',
' class function isArray(Value: JSValue) : boolean;', ' class function isArray(Value: JSValue) : boolean;',
' function concat() : TJSArray; varargs;', ' function concat() : TJSArray; varargs;',
@ -7662,44 +7664,56 @@ begin
'var', 'var',
' aObj: TJSArray;', ' aObj: TJSArray;',
' a: array of longint;', ' a: array of longint;',
' o: TJSObject;',
'begin', 'begin',
' if TJSArray.isArray(65) then ;', ' if TJSArray.isArray(65) then ;',
' aObj:=TJSArray(a).concat(a);']); ' aObj:=TJSArray(a).concat(a);',
' o:=TJSObject(a);']);
ConvertProgram; ConvertProgram;
CheckSource('TestExternalClass_TypeCastArrayToExternalArray', CheckSource('TestExternalClass_TypeCastArrayToExternalClass',
LinesToStr([ // statements LinesToStr([ // statements
'this.aObj = null;', 'this.aObj = null;',
'this.a = [];', 'this.a = [];',
'this.o = null;',
'']), '']),
LinesToStr([ // $mod.$main LinesToStr([ // $mod.$main
'if (Array.isArray(65)) ;', 'if (Array.isArray(65)) ;',
'$mod.aObj = $mod.a.concat($mod.a);', '$mod.aObj = $mod.a.concat($mod.a);',
'$mod.o = $mod.a;',
''])); '']));
end; end;
procedure TTestModule.TestExternalClass_TypeCastArrayFromExternalArray; procedure TTestModule.TestExternalClass_TypeCastArrayFromExternalClass;
begin begin
StartProgram(false); StartProgram(false);
Add('{$modeswitch externalclass}'); Add([
Add('type'); '{$modeswitch externalclass}',
Add(' TArrStr = array of string;'); 'type',
Add(' TJSArray = class external name ''Array'''); ' TArrStr = array of string;',
Add(' end;'); ' TJSArray = class external name ''Array''',
Add('var'); ' end;',
Add(' aObj: TJSArray;'); ' TJSObject = class external name ''Object''',
Add(' a: TArrStr;'); ' end;',
Add('begin'); 'var',
Add(' a:=TArrStr(aObj);'); ' aObj: TJSArray;',
Add(' TArrStr(aObj)[1]:=TArrStr(aObj)[2];'); ' a: TArrStr;',
' jo: TJSObject;',
'begin',
' a:=TArrStr(aObj);',
' TArrStr(aObj)[1]:=TArrStr(aObj)[2];',
' a:=TarrStr(jo);',
'']);
ConvertProgram; ConvertProgram;
CheckSource('TestExternalClass_TypeCastArrayFromExternalArray', CheckSource('TestExternalClass_TypeCastArrayFromExternalClass',
LinesToStr([ // statements LinesToStr([ // statements
'this.aObj = null;', 'this.aObj = null;',
'this.a = [];', 'this.a = [];',
'this.jo = null;',
'']), '']),
LinesToStr([ // $mod.$main LinesToStr([ // $mod.$main
'$mod.a = $mod.aObj;', '$mod.a = $mod.aObj;',
'$mod.aObj[1] = $mod.aObj[2];', '$mod.aObj[1] = $mod.aObj[2];',
'$mod.a = $mod.jo;',
''])); '']));
end; end;

View File

@ -1865,10 +1865,11 @@ function(){
<li><i>for key in jsvalue do</i> translates to <i>for (key in jsvalue){}</i></li> <li><i>for key in jsvalue do</i> translates to <i>for (key in jsvalue){}</i></li>
<li><i>for key in ExternalClass do</i><br> <li><i>for key in ExternalClass do</i><br>
<ul> <ul>
<li>if the externalclass has a ''length'' and a default property e.g. <li>If the externalclass has a ''length'' and a matching default property
<i>for value in TJSArray do</i> translates same as for-in PascalArray, it uses the enumeration of an array. For example
i.e. it enumerates the values of the array, not the index.</li> <i>for value in TJSArray do</i> enumerates the values of the array, not the index.
<li>otherwise translates to <i>for (key in externalclass){}</i>, It checks if the array is nil.</li>
<li>Otherwise it translates to <i>for (key in externalclass){}</i>,
which enumerates the keys (property names) of the JS object.</li> which enumerates the keys (property names) of the JS object.</li>
</ul> </ul>
</ul> </ul>