Skip to content

Commit 23c00f1

Browse files
authored
fix(unity/pesapi-v8): Reset value_persistent in pesapi_release_value_ref (#2342)
v8::Persistent uses NonCopyablePersistentTraits (kResetInDestructor == false), so the implicit ~pesapi_value_ref__() does not release the strong V8 global root. pesapi_release_value_ref freed the C++ struct but never Reset the persistent, so a JS function marshaled into a C# delegate (this path never calls pesapi_set_ref_weak, the persistent stays strong) and everything its closure captures leaked for the isolate lifetime. Affects native backends; WebGL (JS-mock ObjectPool) is unaffected. Add explicit value_persistent.Reset().
1 parent a9a5564 commit 23c00f1

1 file changed

Lines changed: 5 additions & 0 deletions

File tree

unity/native/papi-v8/source/PesapiV8Impl.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -692,6 +692,11 @@ void pesapi_release_value_ref(pesapi_value_ref value_ref)
692692
{
693693
if (!value_ref->env_life_cycle_tracker.expired())
694694
{
695+
// v8::Persistent uses NonCopyablePersistentTraits (kResetInDestructor == false),
696+
// so ~pesapi_value_ref__() does NOT release the strong V8 global root. Without an
697+
// explicit Reset(), a JS function marshaled into a C# delegate (this path never calls
698+
// pesapi_set_ref_weak) and everything its closure captures leak for the isolate's lifetime.
699+
value_ref->value_persistent.Reset();
695700
value_ref->~pesapi_value_ref__();
696701
}
697702
::operator delete(static_cast<void*>(value_ref));

0 commit comments

Comments
 (0)