From cf441f6ffa7e97b834b923ac07d95d3864f9b60f Mon Sep 17 00:00:00 2001 From: Mattias Gaertner Date: Sat, 9 May 2020 08:33:30 +0000 Subject: [PATCH] pas2js: setlength dyn array of static array git-svn-id: trunk@45315 - --- packages/pastojs/src/fppas2js.pp | 1 + packages/pastojs/tests/tcmodules.pas | 50 +++++++++++++++++++++++++++- utils/pas2js/dist/rtl.js | 11 ++++-- 3 files changed, 58 insertions(+), 4 deletions(-) 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; i0){ + } else if (src.$pas2jsrefcnt>0 || depth>=s){ a = []; srclen = src.length; oldlen = srclen; @@ -879,7 +884,7 @@ var rtl = { for (var i=0; i