From b87e8c7257f41d2f3e0c79476592ed080f6e14f5 Mon Sep 17 00:00:00 2001 From: Elmi Ahmadov Date: Fri, 18 Jan 2019 17:19:06 +0100 Subject: [PATCH] Remove Weak object reference from v8WeakReference array when released V8 uses another array called v8WeakReferences to keep the weak objects and this array is used to get object reference count. Thus, when weak object is released it should also be removed from v8WeakReferences array. Fix #347 --- src/main/java/com/eclipsesource/v8/V8Value.java | 10 ++++++---- src/test/java/com/eclipsesource/v8/V8ObjectTest.java | 12 ++++++++++-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/eclipsesource/v8/V8Value.java b/src/main/java/com/eclipsesource/v8/V8Value.java index d22042580..96fecb614 100644 --- a/src/main/java/com/eclipsesource/v8/V8Value.java +++ b/src/main/java/com/eclipsesource/v8/V8Value.java @@ -48,9 +48,9 @@ abstract public class V8Value implements Releasable { public static final int FLOAT_32_ARRAY = 16; public static final int UNDEFINED = 99; - protected V8 v8; - protected long objectHandle; - protected boolean released = true; + protected V8 v8; + protected long objectHandle; + protected boolean released = true; protected V8Value() { super(); @@ -83,7 +83,6 @@ protected void addObjectReference(final long objectHandle) throws Error { } } - /** * Returns a string representation of the V8 Type. * @param type Type to return as a string. See constants in V8Value. @@ -261,6 +260,9 @@ public void close() { v8.checkThread(); if (!released) { try { + if (isWeak()) { + v8.v8WeakReferences.remove(getHandle()); + } v8.releaseObjRef(this); } finally { released = true; diff --git a/src/test/java/com/eclipsesource/v8/V8ObjectTest.java b/src/test/java/com/eclipsesource/v8/V8ObjectTest.java index 2cec19f7c..bb079a54b 100644 --- a/src/test/java/com/eclipsesource/v8/V8ObjectTest.java +++ b/src/test/java/com/eclipsesource/v8/V8ObjectTest.java @@ -1317,7 +1317,7 @@ public void testGetTypeFunction() { public void testGetKeysOnObject() { V8Object v8Object = new V8Object(v8); v8Object.add("integer", 1).add("double", 1.1).add("boolean", true) - .add("string", "hello, world!"); + .add("string", "hello, world!"); String[] keys = v8Object.getKeys(); @@ -1842,11 +1842,19 @@ public void testSetWeakMakesObjectWeak() { @SuppressWarnings("resource") @Test - public void testClearWeakMakesObjectWeak() { + public void testClearWeakMakesObjectNonWeak() { V8Value object = new V8Object(v8).setWeak().clearWeak(); assertFalse(object.isWeak()); object.close(); } + @SuppressWarnings("resource") + @Test + public void testReleaseWeakObjectDoesNotAffectReferenceCount() { + new V8Object(v8).setWeak().close(); + + assertEquals(0, v8.getObjectReferenceCount()); + } + }