mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-27 14:12:17 +02:00
pastojs: typecast array to/from tjsobject
git-svn-id: trunk@39034 -
This commit is contained in:
parent
8364b1f4ca
commit
763fd783e0
@ -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;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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>
|
||||||
|
Loading…
Reference in New Issue
Block a user