mirror of
https://gitlab.com/freepascal.org/fpc/pas2js.git
synced 2025-10-01 14:59:19 +02:00
pas2js: replace setArrayLength with faster non recursive version
This commit is contained in:
parent
a7f83de90c
commit
91bd062189
58
compiler/utils/pas2js/dist/rtl.js
vendored
58
compiler/utils/pas2js/dist/rtl.js
vendored
@ -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){
|
||||||
|
Loading…
Reference in New Issue
Block a user