Skip to content

Commit 1230da9

Browse files
committed
🦄 refactor: Rewrite getV8HeapStatistics(), getV8HeapSpaceStatistics() v1
1 parent bd7972c commit 1230da9

25 files changed

+214
-121
lines changed

Diff for: .github/workflows/android_v8_build.yml

-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ jobs:
8080
gclient sync -D
8181
cd v8
8282
python3 tools/dev/v8gen.py ${{ matrix.v8_release }}.release -- 'target_os="android"' 'target_cpu="${{ matrix.v8_arch }}"' 'v8_target_cpu="${{ matrix.v8_arch }}"' v8_monolithic=true v8_use_external_startup_data=false is_component_build=false v8_enable_i18n_support=false v8_enable_pointer_compression=false v8_static_library=true symbol_level=0 use_custom_libcxx=false v8_enable_sandbox=false
83-
sed -i '/CHECK(!IsFreeSpaceOrFillerMap(map));/d' src/heap/concurrent-marking.cc
8483
ninja -C out.gn/${{ matrix.v8_release }}.release v8_monolith || python3 ${{ env.ROOT }}/Javet/scripts/python/patch_v8_build.py -p ./
8584
ninja -C out.gn/${{ matrix.v8_release }}.release v8_monolith
8685

Diff for: .github/workflows/linux_x86_64_build.yml

-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ jobs:
5252
gclient sync -D
5353
cd v8
5454
python3 tools/dev/v8gen.py x64.release -- v8_monolithic=true v8_use_external_startup_data=false is_component_build=false v8_enable_i18n_support=false v8_enable_pointer_compression=false v8_static_library=true symbol_level=0 use_custom_libcxx=false v8_enable_sandbox=false
55-
sed -i '/CHECK(!IsFreeSpaceOrFillerMap(map));/d' src/heap/concurrent-marking.cc
5655
sed -i '/#include "src\/libplatform\//a #include <cstdlib>' src/libplatform/default-thread-isolated-allocator.cc
5756
sed -i '/bool KernelHasPkruFix()/a const char* env = std::getenv("JAVET_DISABLE_PKU"); if (env && std::strlen(env) > 0) { return false; }' src/libplatform/default-thread-isolated-allocator.cc
5857
ninja -C out.gn/x64.release v8_monolith || python3 ${{ env.ROOT }}/Javet/scripts/python/patch_v8_build.py -p ./

Diff for: .github/workflows/macos_arm64_build.yml

-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ jobs:
5252
gclient sync -D
5353
cd v8
5454
python3 tools/dev/v8gen.py arm64.release -- v8_monolithic=true 'target_cpu="arm64"' v8_use_external_startup_data=false is_component_build=false v8_enable_i18n_support=false v8_enable_pointer_compression=false v8_static_library=true symbol_level=0 use_custom_libcxx=false v8_enable_sandbox=false
55-
sed -i '' -e '/CHECK(!IsFreeSpaceOrFillerMap(map));/d' src/heap/concurrent-marking.cc
5655
gn gen out.gn/arm64.release
5756
ninja -C out.gn/arm64.release v8_monolith || python3 ${{ env.ROOT }}/Javet/scripts/python/patch_v8_build.py -p ./
5857
ninja -C out.gn/arm64.release v8_monolith

Diff for: .github/workflows/macos_x86_64_build.yml

-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ jobs:
5252
gclient sync -D
5353
cd v8
5454
python3 tools/dev/v8gen.py x64.release -- v8_monolithic=true v8_use_external_startup_data=false is_component_build=false v8_enable_i18n_support=false v8_enable_pointer_compression=false v8_static_library=true symbol_level=0 use_custom_libcxx=false v8_enable_sandbox=false
55-
sed -i '' -e '/CHECK(!IsFreeSpaceOrFillerMap(map));/d' src/heap/concurrent-marking.cc
5655
gn gen out.gn/x64.release
5756
ninja -C out.gn/x64.release v8_monolith || python3 ${{ env.ROOT }}/Javet/scripts/python/patch_v8_build.py -p ./
5857
ninja -C out.gn/x64.release v8_monolith

Diff for: cpp/jni/com_caoccao_javet_interop_V8Native.h

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

Diff for: cpp/jni/javet_jni_core_v8.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ JNIEXPORT jlongArray JNICALL Java_com_caoccao_javet_interop_V8Native_getInternal
145145
}
146146

147147
JNIEXPORT jobject JNICALL Java_com_caoccao_javet_interop_V8Native_getV8HeapSpaceStatistics
148-
(JNIEnv* jniEnv, jobject caller, jlong v8RuntimeHandle, jint allocationSpace) {
148+
(JNIEnv* jniEnv, jobject caller, jlong v8RuntimeHandle, jobject allocationSpace) {
149149
auto v8Runtime = Javet::V8Runtime::FromHandle(v8RuntimeHandle);
150150
return Javet::Monitor::GetHeapSpaceStatistics(jniEnv, v8Runtime->v8Isolate, allocationSpace);
151151
}

Diff for: cpp/jni/javet_monitor.cpp

+69-4
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,19 @@
2222
namespace Javet {
2323
namespace Monitor {
2424
void Initialize(JNIEnv* jniEnv) noexcept {
25+
jclassV8AllocationSpace = FIND_CLASS(jniEnv, "com/caoccao/javet/enums/V8AllocationSpace");
26+
jmethodIDV8AllocationSpaceGetIndex = jniEnv->GetMethodID(jclassV8AllocationSpace, "getIndex", "()I");
27+
28+
jclassCompletableFuture = FIND_CLASS(jniEnv, "java/util/concurrent/CompletableFuture");
29+
jmethodIDCompletableFutureConstructor = jniEnv->GetMethodID(jclassCompletableFuture, "<init>", "()V");
30+
jmethodIDCompletableFutureComplete = jniEnv->GetMethodID(jclassCompletableFuture, "complete", "(Ljava/lang/Object;)Z");
31+
2532
jclassV8HeapSpaceStatistics = FIND_CLASS(jniEnv, "com/caoccao/javet/interop/monitoring/V8HeapSpaceStatistics");
2633
jmethodIDV8HeapSpaceStatisticsConstructor = jniEnv->GetMethodID(jclassV8HeapSpaceStatistics, "<init>", "(Ljava/lang/String;JJJJ)V");
34+
jmethodIDV8HeapSpaceStatisticsSetAllocationSpace = jniEnv->GetMethodID(
35+
jclassV8HeapSpaceStatistics,
36+
"setAllocationSpace",
37+
"(Lcom/caoccao/javet/enums/V8AllocationSpace;)Lcom/caoccao/javet/interop/monitoring/V8HeapSpaceStatistics;");
2738

2839
jclassV8HeapStatistics = FIND_CLASS(jniEnv, "com/caoccao/javet/interop/monitoring/V8HeapStatistics");
2940
jmethodIDV8HeapStatisticsConstructor = jniEnv->GetMethodID(jclassV8HeapStatistics, "<init>", "(JJJJJJJJJJJJJJ)V");
@@ -35,23 +46,71 @@ namespace Javet {
3546
jobject GetHeapSpaceStatistics(
3647
JNIEnv* jniEnv,
3748
v8::Isolate* v8Isolate,
38-
const jint allocationSpaceIndex) noexcept {
49+
const jobject jAllocationSpace) noexcept {
50+
jobject jCompletableFuture = jniEnv->NewObject(jclassCompletableFuture, jmethodIDCompletableFutureConstructor);
51+
auto jobjectRefs = new jobject[]{ jniEnv->NewGlobalRef(jCompletableFuture), jniEnv->NewGlobalRef(jAllocationSpace) };
52+
INCREASE_COUNTER(Javet::Monitor::CounterType::New);
53+
INCREASE_COUNTER(Javet::Monitor::CounterType::NewGlobalRef);
54+
INCREASE_COUNTER(Javet::Monitor::CounterType::NewGlobalRef);
55+
if (v8Isolate->IsInUse()) {
56+
v8Isolate->RequestInterrupt(GetHeapSpaceStatisticsCallback, &jobjectRefs);
57+
}
58+
else {
59+
auto v8Locker = v8::Locker(v8Isolate);
60+
GetHeapSpaceStatisticsCallback(v8Isolate, jobjectRefs);
61+
}
62+
return jCompletableFuture;
63+
}
64+
65+
void GetHeapSpaceStatisticsCallback(v8::Isolate* v8Isolate, void* data) noexcept {
66+
FETCH_JNI_ENV(GlobalJavaVM);
3967
v8::HeapSpaceStatistics heapSpaceStatistics;
40-
v8Isolate->GetHeapSpaceStatistics(&heapSpaceStatistics, static_cast<size_t>(allocationSpaceIndex));
41-
return jniEnv->NewObject(jclassV8HeapSpaceStatistics, jmethodIDV8HeapSpaceStatisticsConstructor,
68+
auto jobjectRefs = static_cast<jobject*>(data);
69+
auto jCompletableFuture = jobjectRefs[0];
70+
auto jAllocationSpace = jobjectRefs[1];
71+
auto index = jniEnv->CallIntMethod(jAllocationSpace, jmethodIDV8AllocationSpaceGetIndex);
72+
v8Isolate->GetHeapSpaceStatistics(&heapSpaceStatistics, static_cast<size_t>(index));
73+
auto jHeapSpaceStatistics = jniEnv->NewObject(jclassV8HeapSpaceStatistics, jmethodIDV8HeapSpaceStatisticsConstructor,
4274
Javet::Converter::ToJavaString(jniEnv, heapSpaceStatistics.space_name()),
4375
static_cast<jlong>(heapSpaceStatistics.physical_space_size()),
4476
static_cast<jlong>(heapSpaceStatistics.space_available_size()),
4577
static_cast<jlong>(heapSpaceStatistics.space_size()),
4678
static_cast<jlong>(heapSpaceStatistics.space_used_size()));
79+
jniEnv->CallObjectMethod(jHeapSpaceStatistics, jmethodIDV8HeapSpaceStatisticsSetAllocationSpace, jAllocationSpace);
80+
jniEnv->CallBooleanMethod(jCompletableFuture, jmethodIDCompletableFutureComplete, jHeapSpaceStatistics);
81+
jniEnv->DeleteLocalRef(jHeapSpaceStatistics);
82+
jniEnv->DeleteGlobalRef(jCompletableFuture);
83+
INCREASE_COUNTER(Javet::Monitor::CounterType::DeleteGlobalRef);
84+
jniEnv->DeleteGlobalRef(jAllocationSpace);
85+
INCREASE_COUNTER(Javet::Monitor::CounterType::DeleteGlobalRef);
86+
delete jobjectRefs;
87+
INCREASE_COUNTER(Javet::Monitor::CounterType::Delete);
4788
}
4889

4990
jobject GetHeapStatistics(
5091
JNIEnv* jniEnv,
5192
v8::Isolate* v8Isolate) noexcept {
93+
jobject jCompletableFuture = jniEnv->NewObject(jclassCompletableFuture, jmethodIDCompletableFutureConstructor);
94+
auto jobjectRefs = new jobject[]{ jniEnv->NewGlobalRef(jCompletableFuture) };
95+
INCREASE_COUNTER(Javet::Monitor::CounterType::New);
96+
INCREASE_COUNTER(Javet::Monitor::CounterType::NewGlobalRef);
97+
if (v8Isolate->IsInUse()) {
98+
v8Isolate->RequestInterrupt(GetHeapStatisticsCallback, jobjectRefs);
99+
}
100+
else {
101+
auto v8Locker = v8::Locker(v8Isolate);
102+
GetHeapStatisticsCallback(v8Isolate, jobjectRefs);
103+
}
104+
return jCompletableFuture;
105+
}
106+
107+
void GetHeapStatisticsCallback(v8::Isolate* v8Isolate, void* data) noexcept {
108+
FETCH_JNI_ENV(GlobalJavaVM);
52109
v8::HeapStatistics heapStatistics;
110+
auto jobjectRefs = static_cast<jobject*>(data);
111+
auto jCompletableFuture = jobjectRefs[0];
53112
v8Isolate->GetHeapStatistics(&heapStatistics);
54-
return jniEnv->NewObject(jclassV8HeapStatistics, jmethodIDV8HeapStatisticsConstructor,
113+
auto jHeapStatistics = jniEnv->NewObject(jclassV8HeapStatistics, jmethodIDV8HeapStatisticsConstructor,
55114
static_cast<jlong>(heapStatistics.does_zap_garbage()),
56115
static_cast<jlong>(heapStatistics.external_memory()),
57116
static_cast<jlong>(heapStatistics.heap_size_limit()),
@@ -66,6 +125,12 @@ namespace Javet {
66125
static_cast<jlong>(heapStatistics.total_physical_size()),
67126
static_cast<jlong>(heapStatistics.used_global_handles_size()),
68127
static_cast<jlong>(heapStatistics.used_heap_size()));
128+
jniEnv->CallBooleanMethod(jCompletableFuture, jmethodIDCompletableFutureComplete, jHeapStatistics);
129+
jniEnv->DeleteLocalRef(jHeapStatistics);
130+
jniEnv->DeleteGlobalRef(jCompletableFuture);
131+
INCREASE_COUNTER(Javet::Monitor::CounterType::DeleteGlobalRef);
132+
delete jobjectRefs;
133+
INCREASE_COUNTER(Javet::Monitor::CounterType::Delete);
69134
}
70135

71136
jobject GetV8SharedMemoryStatistics(JNIEnv* jniEnv) noexcept {

Diff for: cpp/jni/javet_monitor.h

+27-14
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,16 @@
2929

3030
namespace Javet {
3131
namespace Monitor {
32+
static jclass jclassV8AllocationSpace;
33+
static jmethodID jmethodIDV8AllocationSpaceGetIndex;
34+
35+
static jclass jclassCompletableFuture;
36+
static jmethodID jmethodIDCompletableFutureConstructor;
37+
static jmethodID jmethodIDCompletableFutureComplete;
38+
3239
static jclass jclassV8HeapSpaceStatistics;
3340
static jmethodID jmethodIDV8HeapSpaceStatisticsConstructor;
41+
static jmethodID jmethodIDV8HeapSpaceStatisticsSetAllocationSpace;
3442

3543
static jclass jclassV8HeapStatistics;
3644
static jmethodID jmethodIDV8HeapStatisticsConstructor;
@@ -43,31 +51,36 @@ namespace Javet {
4351
jobject GetHeapSpaceStatistics(
4452
JNIEnv* jniEnv,
4553
v8::Isolate* v8Isolate,
46-
const jint allocationSpaceIndex) noexcept;
54+
const jobject allocationSpaceIndex) noexcept;
55+
56+
void GetHeapSpaceStatisticsCallback(v8::Isolate* v8Isolate, void* data) noexcept;
4757

4858
jobject GetHeapStatistics(
4959
JNIEnv* jniEnv,
5060
v8::Isolate* v8Isolate) noexcept;
61+
void GetHeapStatisticsCallback(v8::Isolate* v8Isolate, void* data) noexcept;
5162

5263
jobject GetV8SharedMemoryStatistics(JNIEnv* jniEnv) noexcept;
5364

5465
#ifdef ENABLE_MONITOR
5566
namespace CounterType {
5667
enum CounterType {
5768
Reserved = 0,
58-
NewGlobalRef = 1,
59-
NewWeakCallbackReference = 2,
60-
NewJavetCallbackContextReference = 3,
61-
NewPersistentReference = 4,
62-
NewPersistentCallbackContextReference = 5,
63-
NewV8Runtime = 6,
64-
DeleteGlobalRef = 7,
65-
DeleteWeakCallbackReference = 8,
66-
DeleteJavetCallbackContextReference = 9,
67-
DeletePersistentReference = 10,
68-
DeletePersistentCallbackContextReference = 11,
69-
DeleteV8Runtime = 12,
70-
Max = 13,
69+
New = 1,
70+
NewGlobalRef = 2,
71+
NewWeakCallbackReference = 3,
72+
NewJavetCallbackContextReference = 4,
73+
NewPersistentReference = 5,
74+
NewPersistentCallbackContextReference = 6,
75+
NewV8Runtime = 7,
76+
Delete = 8,
77+
DeleteGlobalRef = 9,
78+
DeleteWeakCallbackReference = 10,
79+
DeleteJavetCallbackContextReference = 11,
80+
DeletePersistentReference = 12,
81+
DeletePersistentCallbackContextReference = 13,
82+
DeleteV8Runtime = 14,
83+
Max = 15,
7184
};
7285
};
7386

Diff for: docs/reference/resource_management/memory_management.rst

+2-2
Original file line numberDiff line numberDiff line change
@@ -241,8 +241,8 @@ Statistics
241241

242242
V8 exposes quite a few statistics for applications to analyze the memory usage, performance, etc. Javet selectively exposes some of those statistics via ``V8Runtime`` or ``V8Host``.
243243

244-
* `getV8HeapSpaceStatistics() <../javadoc/com/caoccao/javet/interop/V8Runtime.html#getV8HeapSpaceStatistics-com.caoccao.javet.interop.monitoring.V8HeapSpaceStatistics.AllocationSpace->`_
245-
* `getV8HeapStatistics() <../javadoc/com/caoccao/javet/interop/V8Runtime.html#getV8HeapStatistics-->`_
244+
* `getV8HeapSpaceStatistics() <../javadoc/com/caoccao/javet/interop/V8Runtime.html#getV8HeapSpaceStatistics-com.caoccao.javet.interop.monitoring.V8HeapSpaceStatistics.AllocationSpace->`_ (Asynchronous)
245+
* `getV8HeapStatistics() <../javadoc/com/caoccao/javet/interop/V8Runtime.html#getV8HeapStatistics-->`_ (Asynchronous)
246246
* `getV8SharedMemoryStatistics() <../javadoc/com/caoccao/javet/interop/V8Host.html#getV8SharedMemoryStatistics-->`_
247247

248248
.. image:: ../../resources/images/statistics_v8_heap_space_statistics.png

Diff for: docs/release_notes/release_notes_3_1.rst

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ Release Notes 3.1.x
55
3.1.4 V8 v12.7
66
--------------
77

8+
* Rewrote ``getV8HeapStatistics()``, ``getV8HeapSpaceStatistics()`` for ``V8Runtime`` to remediate the racing condition
9+
810
3.1.3 V8 v12.6
911
--------------
1012

Diff for: src/main/java/com/caoccao/javet/interop/IV8Native.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ boolean functionSetSourceCode(
136136

137137
long[] getInternalStatistic();
138138

139-
Object getV8HeapSpaceStatistics(long v8RuntimeHandle, int allocationSpace);
139+
Object getV8HeapSpaceStatistics(long v8RuntimeHandle, Object v8AllocationSpace);
140140

141141
Object getV8HeapStatistics(long v8RuntimeHandle);
142142

Diff for: src/main/java/com/caoccao/javet/interop/V8Native.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ public native boolean functionSetSourceCode(
195195
public native long[] getInternalStatistic();
196196

197197
@Override
198-
public native Object getV8HeapSpaceStatistics(long v8RuntimeHandle, int allocationSpace);
198+
public native Object getV8HeapSpaceStatistics(long v8RuntimeHandle, Object v8AllocationSpace);
199199

200200
@Override
201201
public native Object getV8HeapStatistics(long v8RuntimeHandle);

Diff for: src/main/java/com/caoccao/javet/interop/V8Runtime.java

+8-8
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import java.text.MessageFormat;
5252
import java.time.ZonedDateTime;
5353
import java.util.*;
54+
import java.util.concurrent.CompletableFuture;
5455
import java.util.concurrent.CopyOnWriteArrayList;
5556

5657
import static com.caoccao.javet.exceptions.JavetError.PARAMETER_FEATURE;
@@ -1553,23 +1554,22 @@ public RuntimeOptions<?> getRuntimeOptions() {
15531554
* Gets V8 heap space statistics by an allocation space.
15541555
*
15551556
* @param v8AllocationSpace the V8 allocation space
1556-
* @return the V8 heap space statistics
1557+
* @return the V8 heap space statistics in a complete future
15571558
* @since 1.0.4
15581559
*/
1559-
public V8HeapSpaceStatistics getV8HeapSpaceStatistics(V8AllocationSpace v8AllocationSpace) {
1560-
Objects.requireNonNull(v8AllocationSpace);
1561-
return ((V8HeapSpaceStatistics) v8Native.getV8HeapSpaceStatistics(handle, v8AllocationSpace.getIndex()))
1562-
.setAllocationSpace(v8AllocationSpace);
1560+
public CompletableFuture<V8HeapSpaceStatistics> getV8HeapSpaceStatistics(V8AllocationSpace v8AllocationSpace) {
1561+
return (CompletableFuture<V8HeapSpaceStatistics>) v8Native.getV8HeapSpaceStatistics(
1562+
handle, Objects.requireNonNull(v8AllocationSpace));
15631563
}
15641564

15651565
/**
15661566
* Gets V8 heap statistics.
15671567
*
1568-
* @return the V8 heap statistics
1568+
* @return the V8 heap statistics in a complete future
15691569
* @since 1.0.0
15701570
*/
1571-
public V8HeapStatistics getV8HeapStatistics() {
1572-
return (V8HeapStatistics) v8Native.getV8HeapStatistics(handle);
1571+
public CompletableFuture<V8HeapStatistics> getV8HeapStatistics() {
1572+
return (CompletableFuture<V8HeapStatistics>) v8Native.getV8HeapStatistics(handle);
15731573
}
15741574

15751575
/**

Diff for: src/main/java/com/caoccao/javet/interop/engine/JavetEnginePool.java

+1-8
Original file line numberDiff line numberDiff line change
@@ -296,24 +296,17 @@ public int observe(IV8RuntimeObserver<?>... observers) {
296296
IJavetLogger logger = config.getJavetLogger();
297297
for (JavetEngine<R> engine : engines) {
298298
if (engine != null) {
299-
boolean isContinuable = true;
300299
for (IV8RuntimeObserver<?> observer : observers) {
301300
if (!engine.v8Runtime.isClosed()) {
302301
try {
303-
isContinuable = observer.observe(engine.v8Runtime);
302+
observer.observe(engine.v8Runtime);
304303
} catch (Throwable t) {
305304
logger.error(t.getMessage(), t);
306305
} finally {
307306
++processedCount;
308307
}
309-
if (!isContinuable) {
310-
break;
311-
}
312308
}
313309
}
314-
if (!isContinuable) {
315-
break;
316-
}
317310
}
318311
}
319312
}

Diff for: src/main/java/com/caoccao/javet/interop/engine/observers/IV8RuntimeObserver.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,11 @@ default R getResult() {
3737

3838
/**
3939
* Observe the input V8 runtime.
40-
* The return value notifies the owner to whether continue or break.
4140
*
4241
* @param v8Runtime the V8 runtime
43-
* @return true : continue, false : break
4442
* @since 1.0.5
4543
*/
46-
boolean observe(V8Runtime v8Runtime);
44+
void observe(V8Runtime v8Runtime);
4745

4846
/**
4947
* Reset.

Diff for: src/main/java/com/caoccao/javet/interop/engine/observers/V8RuntimeObserverAverageCallbackContextCount.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,8 @@ public Integer getResult() {
6868
}
6969

7070
@Override
71-
public boolean observe(V8Runtime v8Runtime) {
71+
public void observe(V8Runtime v8Runtime) {
7272
callbackContextCountList.add(v8Runtime.getCallbackContextCount());
73-
return true;
7473
}
7574

7675
@Override

Diff for: src/main/java/com/caoccao/javet/interop/engine/observers/V8RuntimeObserverAverageReferenceCount.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,8 @@ public Integer getResult() {
6868
}
6969

7070
@Override
71-
public boolean observe(V8Runtime v8Runtime) {
71+
public void observe(V8Runtime v8Runtime) {
7272
referenceCountList.add(v8Runtime.getReferenceCount());
73-
return true;
7473
}
7574

7675
@Override

0 commit comments

Comments
 (0)