pastojs: fixed arraySetLength shrink

This commit is contained in:
mattias 2020-08-05 19:53:36 +00:00
parent 0542edda2a
commit fb4c21f3b2

View File

@ -850,44 +850,51 @@ var rtl = {
srclen = 0;
oldlen = a.length;
}
a.length = stack[depth].dim;
lastlen = stack[depth].dim;
a.length = lastlen;
if (depth>0){
item.a[item.i]=a;
item.i++;
if ((lastlen===0) && (item.i<item.a.length)) continue;
}
if (depth<dimmax){
item = stack[depth];
item.a = a;
item.i = 0;
item.src = src;
depth++;
} else {
if (rtl.isArray(defaultvalue)){
// array of dyn array
for (var i=0; i<srclen; i++) a[i]=src[i];
for (var i=oldlen; i<lastlen; i++) a[i]=[];
} else if (rtl.isObject(defaultvalue)) {
if (rtl.isTRecord(defaultvalue)){
// array of record
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 {
// 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]={};
}
if (lastlen>0){
if (depth<dimmax){
item = stack[depth];
item.a = a;
item.i = 0;
item.src = src;
depth++;
continue;
} else {
for (var i=0; i<srclen; i++) a[i]=src[i];
for (var i=oldlen; i<lastlen; i++) a[i]=defaultvalue;
}
while ((depth>0) && (stack[depth-1].i>=stack[depth-1].dim)){
depth--;
};
if (depth===0){
if (dimmax===0) return a;
return stack[0].a;
if (srclen>lastlen) srclen=lastlen;
if (rtl.isArray(defaultvalue)){
// array of dyn array
for (var i=0; i<srclen; i++) a[i]=src[i];
for (var i=oldlen; i<lastlen; i++) a[i]=[];
} else if (rtl.isObject(defaultvalue)) {
if (rtl.isTRecord(defaultvalue)){
// array of record
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 {
// 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]={};
}
} else {
for (var i=0; i<srclen; i++) a[i]=src[i];
for (var i=oldlen; i<lastlen; i++) a[i]=defaultvalue;
}
}
}
// backtrack
while ((depth>0) && (stack[depth-1].i>=stack[depth-1].dim)){
depth--;
};
if (depth===0){
if (dimmax===0) return a;
return stack[0].a;
}
}while (true);
},