From 5119b7c83a63edc397c5ca75846845a024d69c2c Mon Sep 17 00:00:00 2001 From: iofit Date: Tue, 25 Oct 2022 12:57:06 -0700 Subject: [PATCH 1/2] [444] - Add custom implementation of an ArrayList that overrides equals method comparing only references and size --- .../eclipsesource/v8/utils/MemoryManager.java | 56 ++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/eclipsesource/v8/utils/MemoryManager.java b/src/main/java/com/eclipsesource/v8/utils/MemoryManager.java index 7f236ae56..b71d8af80 100644 --- a/src/main/java/com/eclipsesource/v8/utils/MemoryManager.java +++ b/src/main/java/com/eclipsesource/v8/utils/MemoryManager.java @@ -11,7 +11,10 @@ package com.eclipsesource.v8.utils; import java.util.ArrayList; +import java.util.ConcurrentModificationException; import java.util.Iterator; +import java.util.List; +import java.util.Objects; import com.eclipsesource.v8.ReferenceHandler; import com.eclipsesource.v8.V8; @@ -30,7 +33,7 @@ public class MemoryManager { private MemoryManagerReferenceHandler memoryManagerReferenceHandler; private V8 v8; - private ArrayList references = new ArrayList(); + private SimpleArrayList references = new SimpleArrayList<>(); private boolean releasing = false; private boolean released = false; @@ -135,4 +138,55 @@ public void v8HandleDisposed(final V8Value object) { } } + /** + * Custom implementation of ArrayList that overrides equality to instead of compare element by element would only
+ * compare references and ranges. + * @param – the type of elements in this list + */ + private static class SimpleArrayList extends ArrayList { + + @Override + public boolean equals(Object o) { + if (o == this) { + return true; + } + + if (!(o instanceof List)) { + return false; + } + + final int expectedModCount = modCount; + // ArrayList can be subclassed and given arbitrary behavior, but we can + // still deal with the common case where o is ArrayList precisely + boolean equal = equalsRange((List) o, 0, this.size()); + + checkForComodification(expectedModCount); + return equal; + } + + boolean equalsRange(List other, int from, int to) { + final Object[] es = this.toArray(); + if (to > es.length) { + throw new ConcurrentModificationException(); + } + Iterator oit = other.iterator(); + for (; from < to; from++) { + if (!oit.hasNext() || !Objects.equals(es[from], oit.next())) { + return false; + } + } + return !oit.hasNext(); + } + + private void checkForComodification(final int expectedModCount) { + if (modCount != expectedModCount) { + throw new ConcurrentModificationException(); + } + } + + public int size() { + return super.size(); + } + } + } From ede5d9cd9df7db9527dcfac37c9028e879a5c57d Mon Sep 17 00:00:00 2001 From: iofit Date: Tue, 25 Oct 2022 12:59:25 -0700 Subject: [PATCH 2/2] [444] - Remove diamond contraction for generic type --- src/main/java/com/eclipsesource/v8/utils/MemoryManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/eclipsesource/v8/utils/MemoryManager.java b/src/main/java/com/eclipsesource/v8/utils/MemoryManager.java index b71d8af80..3482f0591 100644 --- a/src/main/java/com/eclipsesource/v8/utils/MemoryManager.java +++ b/src/main/java/com/eclipsesource/v8/utils/MemoryManager.java @@ -33,7 +33,7 @@ public class MemoryManager { private MemoryManagerReferenceHandler memoryManagerReferenceHandler; private V8 v8; - private SimpleArrayList references = new SimpleArrayList<>(); + private SimpleArrayList references = new SimpleArrayList(); private boolean releasing = false; private boolean released = false;