diff --git a/packages/pastojs/src/fppas2js.pp b/packages/pastojs/src/fppas2js.pp index dc00e20367..4bf8ff4291 100644 --- a/packages/pastojs/src/fppas2js.pp +++ b/packages/pastojs/src/fppas2js.pp @@ -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; diff --git a/packages/pastojs/tests/tcmodules.pas b/packages/pastojs/tests/tcmodules.pas index c7176674fc..77aa42a461 100644 --- a/packages/pastojs/tests/tcmodules.pas +++ b/packages/pastojs/tests/tcmodules.pas @@ -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; diff --git a/utils/pas2js/dist/rtl.js b/utils/pas2js/dist/rtl.js index e8f3685702..3c695d0bae 100644 --- a/utils/pas2js/dist/rtl.js +++ b/utils/pas2js/dist/rtl.js @@ -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]={}; }