Skip to content

Commit 08e1ba1

Browse files
committed
Adds a method to check if an object has been set weak
Uses V8 to determine if setWeak has been called on this Object. This change-set also changes the way `setWeak` works. `setWeak` now returns this, so object chaining can be used. Finally, V8#referenceCounts have been updated to include a count of Weak objects. That is, if an object is marked weak, it should not count towards the Object count. Change-Id: I28d9023add2ff7e180bd30356665b9055df9cd38
1 parent c6d11fb commit 08e1ba1

File tree

5 files changed

+50
-3
lines changed

5 files changed

+50
-3
lines changed

jni/com_eclipsesource_v8_V8Impl.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -1698,6 +1698,12 @@ JNIEXPORT void JNICALL Java_com_eclipsesource_v8_V8__1setWeak
16981698
}, WeakCallbackType::kFinalizer);
16991699
}
17001700

1701+
JNIEXPORT jboolean JNICALL Java_com_eclipsesource_v8_V8__1isWeak
1702+
(JNIEnv * env, jobject, jlong v8RuntimePtr, jlong objectHandle) {
1703+
Isolate* isolate = SETUP(env, v8RuntimePtr, 0);
1704+
return reinterpret_cast<Persistent<Object>*>(objectHandle)->IsWeak();
1705+
}
1706+
17011707
JNIEXPORT jlong JNICALL Java_com_eclipsesource_v8_V8__1registerJavaMethod
17021708
(JNIEnv *env, jobject, jlong v8RuntimePtr, jlong objectHandle, jstring functionName, jboolean voidMethod) {
17031709
Isolate* isolate = SETUP(env, v8RuntimePtr, 0);

jni/com_eclipsesource_v8_V8Impl.h

+8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main/java/com/eclipsesource/v8/V8.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ public static int getActiveRuntimes() {
296296
* @return The number of Object References on this runtime.
297297
*/
298298
public long getObjectReferenceCount() {
299-
return objectReferences;
299+
return objectReferences - v8WeakReferences.size();
300300
}
301301

302302
protected long getV8RuntimePtr() {
@@ -370,7 +370,7 @@ public void release(final boolean reportMemoryLeaks) {
370370
_releaseRuntime(v8RuntimePtr);
371371
v8RuntimePtr = 0L;
372372
released = true;
373-
if (reportMemoryLeaks && ((objectReferences - v8WeakReferences.size()) > 0)) {
373+
if (reportMemoryLeaks && (getObjectReferenceCount() > 0)) {
374374
throw new IllegalStateException(objectReferences + " Object(s) still exist in runtime");
375375
}
376376
}
@@ -1055,6 +1055,10 @@ protected void setWeak(final long v8RuntimePtr, final long objectHandle) {
10551055
_setWeak(v8RuntimePtr, objectHandle);
10561056
}
10571057

1058+
protected boolean isWeak(final long v8RuntimePtr, final long objectHandle) {
1059+
return _isWeak(v8RuntimePtr, objectHandle);
1060+
}
1061+
10581062
protected void release(final long v8RuntimePtr, final long objectHandle) {
10591063
_release(v8RuntimePtr, objectHandle);
10601064
}
@@ -1523,6 +1527,8 @@ protected void releaseMethodDescriptor(final long v8RuntimePtr, final long metho
15231527

15241528
private native void _setWeak(long runtimePtr, long objectHandle);
15251529

1530+
private native boolean _isWeak(long runtimePtr, long objectHandle);
1531+
15261532
private native ByteBuffer _createV8ArrayBufferBackingStore(final long v8RuntimePtr, final long objectHandle, final int capacity);
15271533

15281534
private native static String _getVersion();

src/main/java/com/eclipsesource/v8/V8Value.java

+14-1
Original file line numberDiff line numberDiff line change
@@ -212,11 +212,24 @@ public V8Value twin() {
212212
* the object will be released, so this should only be used if there is no
213213
* other way to track object usage.
214214
*/
215-
public void setWeak() {
215+
public V8Value setWeak() {
216216
v8.checkThread();
217217
v8.checkReleased();
218218
v8.v8WeakReferences.put(getHandle(), this);
219219
v8.setWeak(v8.getV8RuntimePtr(), getHandle());
220+
return this;
221+
}
222+
223+
/**
224+
* If {@link V8Value#setWeak()} has been called on this Object, this method
225+
* will return true. Otherwise it will return false.
226+
*
227+
* @return Returns true if this object has been set 'Weak', return false otherwise.
228+
*/
229+
public boolean isWeak() {
230+
v8.checkThread();
231+
v8.checkReleased();
232+
return v8.isWeak(v8.getV8RuntimePtr(), getHandle());
220233
}
221234

222235
/**

src/test/java/com/eclipsesource/v8/V8ObjectTest.java

+14
Original file line numberDiff line numberDiff line change
@@ -1733,4 +1733,18 @@ public void testGetType_Undefined() {
17331733
assertEquals(V8Value.UNDEFINED, V8.getUndefined().getV8Type());
17341734
}
17351735

1736+
@Test
1737+
public void testWeakReferenceReducesObjectCount() {
1738+
new V8Object(v8).setWeak();
1739+
1740+
assertEquals(0, v8.getObjectReferenceCount());
1741+
}
1742+
1743+
@Test
1744+
public void setWeakMakesObjectWeak() {
1745+
V8Value object = new V8Object(v8).setWeak();
1746+
1747+
assertTrue(object.isWeak());
1748+
}
1749+
17361750
}

0 commit comments

Comments
 (0)