pas2js: replace setArrayLength with faster non recursive version

This commit is contained in:
mattias 2019-09-18 15:35:32 +00:00
parent a7f83de90c
commit 91bd062189

View File

@ -802,34 +802,56 @@ var rtl = {
}, },
arraySetLength: function(arr,defaultvalue,newlength){ arraySetLength: function(arr,defaultvalue,newlength){
// multi dim: (arr,defaultvalue,dim1,dim2,...) var stack = [];
var p = arguments; for (var i=2; i<arguments.length; i++){
function setLength(src,argNo){ stack.push({ dim:arguments[i]+0, a:null, i:0, src:null });
var newlen = p[argNo]; }
var a = []; var dimmax = stack.length-1;
a.length = newlength; var depth = 0;
if (argNo === p.length-1){ var lastlen = stack[dimmax].dim;
var oldlen = src?src.length:0; var item = null;
var a = null;
var src = arr;
var oldlen = 0
do{
a = [];
if (depth>0){
item=stack[depth-1];
item.a[item.i]=a;
src = (item.src && item.src.length>item.i)?item.src[item.i]:null;
item.i++;
}
if (depth<dimmax){
item = stack[depth];
item.a = a;
item.i = 0;
item.src = src;
depth++;
} else {
oldlen = src?src.length:0;
if (rtl.isArray(defaultvalue)){ if (rtl.isArray(defaultvalue)){
for (var i=0; i<newlen; i++) a[i]=(i<oldlen)?src[i]:[]; // array of dyn array for (var i=0; i<lastlen; i++) a[i]=(i<oldlen)?src[i]:[]; // array of dyn array
} else if (rtl.isObject(defaultvalue)) { } else if (rtl.isObject(defaultvalue)) {
if (rtl.isTRecord(defaultvalue)){ if (rtl.isTRecord(defaultvalue)){
for (var i=0; i<newlen; i++) for (var i=0; i<lastlen; i++){
a[i]=(i<oldlen)?defaultvalue.$clone(src[i]):defaultvalue.$new(); // e.g. record a[i]=(i<oldlen)?defaultvalue.$clone(src[i]):defaultvalue.$new(); // e.g. record
}
} else { } else {
for (var i=0; i<newlen; i++) a[i]=(i<oldlen)?rtl.refSet(src[i]):{}; // e.g. set for (var i=0; i<lastlen; i++) a[i]=(i<oldlen)?rtl.refSet(src[i]):{}; // e.g. set
} }
} else { } else {
for (var i=0; i<newlen; i++) for (var i=0; i<lastlen; i++)
a[i]=(i<oldlen)?src[i]:defaultvalue; a[i]=(i<oldlen)?src[i]:defaultvalue;
} }
} else { while ((depth>0) && (stack[depth-1].i===stack[depth-1].dim)){
// multi dim array depth--;
for (var i=0; i<newlen; i++) a[i]=setLength(src?src[i]:null,argNo+1); };
if (depth===0){
if (dimmax===0) return a;
return stack[0].a;
}
} }
return a; }while (true);
}
return setLength(arr,2);
}, },
/*arrayChgLength: function(arr,defaultvalue,newlength){ /*arrayChgLength: function(arr,defaultvalue,newlength){