fix: call move when passing same array to copyTo
This commit is contained in:
parent
c6dc031cfd
commit
c4d44547c8
@ -82,15 +82,20 @@ public class ArrayValue extends ObjectValue implements Iterable<Object> {
|
|||||||
else arr[i + sourceStart] = values[i + destStart];
|
else arr[i + sourceStart] = values[i + destStart];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public void copyTo(Context ctx, ArrayValue arr, int sourceStart, int destStart, int count) {
|
public void copyTo(ArrayValue arr, int sourceStart, int destStart, int count) {
|
||||||
|
if (arr == this) {
|
||||||
|
move(sourceStart, destStart, count);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Iterate in reverse to reallocate at most once
|
// Iterate in reverse to reallocate at most once
|
||||||
if (destStart + count > arr.size) arr.size = destStart + count;
|
if (destStart + count > arr.size) arr.size = destStart + count;
|
||||||
|
|
||||||
for (var i = count - 1; i >= 0; i--) {
|
for (var i = count - 1; i >= 0; i--) {
|
||||||
if (i + sourceStart < 0 || i + sourceStart >= size) arr.remove(i + destStart);
|
if (i + sourceStart < 0 || i + sourceStart >= size) arr.remove(i + destStart);
|
||||||
if (values[i + sourceStart] == UNDEFINED) arr.set(ctx, i + destStart, null);
|
if (values[i + sourceStart] == UNDEFINED) arr.set(null, i + destStart, null);
|
||||||
else if (values[i + sourceStart] == null) arr.remove(i + destStart);
|
else if (values[i + sourceStart] == null) arr.remove(i + destStart);
|
||||||
else arr.set(ctx, i + destStart, values[i + sourceStart]);
|
else arr.set(null, i + destStart, values[i + sourceStart]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,7 +94,7 @@ public class ArrayLib {
|
|||||||
if (arrs.get(i) instanceof ArrayValue) {
|
if (arrs.get(i) instanceof ArrayValue) {
|
||||||
var arrEl = arrs.convert(i, ArrayValue.class);
|
var arrEl = arrs.convert(i, ArrayValue.class);
|
||||||
int n = arrEl.size();
|
int n = arrEl.size();
|
||||||
arrEl.copyTo(args.ctx, res, 0, j, n);
|
arrEl.copyTo(res, 0, j, n);
|
||||||
j += n;
|
j += n;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -382,7 +382,7 @@ public class ArrayLib {
|
|||||||
var end = normalizeI(arr.size(), args.getInt(1, arr.size()), true);
|
var end = normalizeI(arr.size(), args.getInt(1, arr.size()), true);
|
||||||
|
|
||||||
var res = new ArrayValue(end - start);
|
var res = new ArrayValue(end - start);
|
||||||
arr.copyTo(args.ctx, res, start, 0, end - start);
|
arr.copyTo(res, start, 0, end - start);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -396,7 +396,7 @@ public class ArrayLib {
|
|||||||
|
|
||||||
var size = arr.size() - deleteCount + items.length;
|
var size = arr.size() - deleteCount + items.length;
|
||||||
var res = new ArrayValue(deleteCount);
|
var res = new ArrayValue(deleteCount);
|
||||||
arr.copyTo(args.ctx, res, start, 0, deleteCount);
|
arr.copyTo(res, start, 0, deleteCount);
|
||||||
arr.move(start + deleteCount, start + items.length, arr.size() - start - deleteCount);
|
arr.move(start + deleteCount, start + items.length, arr.size() - start - deleteCount);
|
||||||
arr.copyFrom(args.ctx, items, 0, start, items.length);
|
arr.copyFrom(args.ctx, items, 0, start, items.length);
|
||||||
arr.setSize(size);
|
arr.setSize(size);
|
||||||
|
Loading…
Reference in New Issue
Block a user