From c4d44547c8bcd3cb53888c06e2ecd60a3e9a3b50 Mon Sep 17 00:00:00 2001 From: TopchetoEU <36534413+TopchetoEU@users.noreply.github.com> Date: Wed, 21 Feb 2024 11:03:19 +0200 Subject: [PATCH] fix: call move when passing same array to copyTo --- .../jscript/core/engine/values/ArrayValue.java | 11 ++++++++--- src/java/me/topchetoeu/jscript/lib/ArrayLib.java | 6 +++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/java/me/topchetoeu/jscript/core/engine/values/ArrayValue.java b/src/java/me/topchetoeu/jscript/core/engine/values/ArrayValue.java index 01565cd..a6c749c 100644 --- a/src/java/me/topchetoeu/jscript/core/engine/values/ArrayValue.java +++ b/src/java/me/topchetoeu/jscript/core/engine/values/ArrayValue.java @@ -82,15 +82,20 @@ public class ArrayValue extends ObjectValue implements Iterable { 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 if (destStart + count > arr.size) arr.size = destStart + count; for (var i = count - 1; i >= 0; i--) { 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 arr.set(ctx, i + destStart, values[i + sourceStart]); + else arr.set(null, i + destStart, values[i + sourceStart]); } } diff --git a/src/java/me/topchetoeu/jscript/lib/ArrayLib.java b/src/java/me/topchetoeu/jscript/lib/ArrayLib.java index 5117d85..a1cab7e 100644 --- a/src/java/me/topchetoeu/jscript/lib/ArrayLib.java +++ b/src/java/me/topchetoeu/jscript/lib/ArrayLib.java @@ -94,7 +94,7 @@ public class ArrayLib { if (arrs.get(i) instanceof ArrayValue) { var arrEl = arrs.convert(i, ArrayValue.class); int n = arrEl.size(); - arrEl.copyTo(args.ctx, res, 0, j, n); + arrEl.copyTo(res, 0, j, n); j += n; } else { @@ -382,7 +382,7 @@ public class ArrayLib { var end = normalizeI(arr.size(), args.getInt(1, arr.size()), true); var res = new ArrayValue(end - start); - arr.copyTo(args.ctx, res, start, 0, end - start); + arr.copyTo(res, start, 0, end - start); return res; } @@ -396,7 +396,7 @@ public class ArrayLib { var size = arr.size() - deleteCount + items.length; 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.copyFrom(args.ctx, items, 0, start, items.length); arr.setSize(size);