pas2js: setlength dyn array of static array

git-svn-id: trunk@45315 -
This commit is contained in:
Mattias Gaertner 2020-05-09 08:33:30 +00:00
parent 04a42bef84
commit cf441f6ffa
3 changed files with 58 additions and 4 deletions

View File

@ -11346,6 +11346,7 @@ begin
Call.AddArg(ConvertExpression(El.Params[i],AContext));
if StaticDims<>nil then
begin
Call.AddArg(CreateLiteralJSString(El,'s'));
for i:=0 to StaticDims.Count-1 do
Call.AddArg(TJSElement(StaticDims[i]));
StaticDims.OwnsObjects:=false;

View File

@ -436,6 +436,7 @@ type
Procedure TestArray_SetLengthOutArg;
Procedure TestArray_SetLengthProperty;
Procedure TestArray_SetLengthMultiDim;
Procedure TestArray_SetLengthDynOfStatic;
Procedure TestArray_OpenArrayOfString;
Procedure TestArray_ArrayOfCharAssignString; // ToDo
Procedure TestArray_ConstRef;
@ -9423,7 +9424,54 @@ begin
LinesToStr([
'$mod.a = rtl.arraySetLength($mod.a, [], 2);',
'$mod.a = rtl.arraySetLength($mod.a, 0, 3, 4);',
'$mod.b = rtl.arraySetLength($mod.b, 0, 5, 2);',
'$mod.b = rtl.arraySetLength($mod.b, 0, 5, "s", 2);',
'']));
end;
procedure TTestModule.TestArray_SetLengthDynOfStatic;
begin
StartProgram(false);
Add([
'type',
' TStaArr1 = array[1..3] of boolean;',
//' TStaArr2 = array[5..6] of TStaArr1;',
' TDynArr1StaArr1 = array of TStaArr1;',
//' TDynArr1StaArr2 = array of TStaArr2;',
' TDynArr2StaArr1 = array of TDynArr1StaArr1;',
//' TDynArr2StaArr2 = array of TDynArr1StaArr2;',
'var',
' DynArr1StaArr1: TDynArr1StaArr1;',
//' DynArr1StaArr2: TDynArr1StaArr1;',
' DynArr2StaArr1: TDynArr2StaArr1;',
//' DynArr2StaArr2: TDynArr2StaArr2;',
'begin',
' SetLength(DynArr1StaArr1,11);',
' SetLength(DynArr2StaArr1,12);',
' SetLength(DynArr2StaArr1[13],14);',
' SetLength(DynArr2StaArr1,15,16);',
//' SetLength(DynArr1StaArr2,21);',
//' SetLength(DynArr2StaArr2,22);',
//' SetLength(DynArr2StaArr2[23],24);',
//' SetLength(DynArr2StaArr2,25,26);',
'']);
ConvertProgram;
CheckSource('TestArray_DynOfStatic',
LinesToStr([ // statements
'this.DynArr1StaArr1 = [];',
'this.DynArr2StaArr1 = [];',
'']),
LinesToStr([ // $mod.$main
'$mod.DynArr1StaArr1 = rtl.arraySetLength($mod.DynArr1StaArr1, false, 11, "s", 3);',
'$mod.DynArr2StaArr1 = rtl.arraySetLength($mod.DynArr2StaArr1, [], 12);',
'$mod.DynArr2StaArr1[13] = rtl.arraySetLength($mod.DynArr2StaArr1[13], false, 14, "s", 3);',
'$mod.DynArr2StaArr1 = rtl.arraySetLength(',
' $mod.DynArr2StaArr1,',
' false,',
' 15,',
' 16,',
' "s",',
' 3',
');',
'']));
end;

View File

@ -829,8 +829,13 @@ var rtl = {
arraySetLength: function(arr,defaultvalue,newlength){
var stack = [];
var s = 9999;
for (var i=2; i<arguments.length; i++){
stack.push({ dim:arguments[i]+0, a:null, i:0, src:null });
var j = arguments[i];
if (j==='s'){ s = i-2; }
else {
stack.push({ dim:j+0, a:null, i:0, src:null });
}
}
var dimmax = stack.length-1;
var depth = 0;
@ -848,7 +853,7 @@ var rtl = {
a = [];
srclen = 0;
oldlen = 0;
} else if (src.$pas2jsrefcnt>0){
} else if (src.$pas2jsrefcnt>0 || depth>=s){
a = [];
srclen = src.length;
oldlen = srclen;
@ -879,7 +884,7 @@ var rtl = {
for (var i=0; i<srclen; i++) a[i]=defaultvalue.$clone(src[i]);
for (var i=oldlen; i<lastlen; i++) a[i]=defaultvalue.$new();
} else {
// set
// array of set
for (var i=0; i<srclen; i++) a[i]=rtl.refSet(src[i]);
for (var i=oldlen; i<lastlen; i++) a[i]={};
}