mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-14 04:19:28 +02:00
pas2js: setlength dyn array of static array
git-svn-id: trunk@45315 -
This commit is contained in:
parent
04a42bef84
commit
cf441f6ffa
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
11
utils/pas2js/dist/rtl.js
vendored
11
utils/pas2js/dist/rtl.js
vendored
@ -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]={};
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user