@@ -698,7 +698,7 @@ void Napi::executePendingNapiModule(Zig::GlobalObject* globalObject)
698698 ASSERT (globalObject->m_pendingNapiModule );
699699
700700 auto & mod = *globalObject->m_pendingNapiModule ;
701- napi_env env = globalObject->makeNapiEnv (mod);
701+ Ref<NapiEnv> env = globalObject->makeNapiEnv (mod);
702702 auto keyStr = WTF::String::fromUTF8 (mod.nm_modname );
703703 JSValue pendingNapiModule = globalObject->m_pendingNapiModuleAndExports [0 ].get ();
704704 JSObject* object = (pendingNapiModule && pendingNapiModule.isObject ()) ? pendingNapiModule.getObject ()
@@ -727,7 +727,7 @@ void Napi::executePendingNapiModule(Zig::GlobalObject* globalObject)
727727 JSValue resultValue;
728728
729729 if (mod.nm_register_func ) {
730- resultValue = toJS (mod.nm_register_func (env, toNapi (object, globalObject)));
730+ resultValue = toJS (mod.nm_register_func (env. ptr () , toNapi (object, globalObject)));
731731 } else {
732732 JSValue errorInstance = createError (globalObject, makeString (" Module has no declared entry point." _s));
733733 globalObject->m_pendingNapiModuleAndExports [0 ].set (vm, globalObject, errorInstance);
@@ -751,7 +751,7 @@ void Napi::executePendingNapiModule(Zig::GlobalObject* globalObject)
751751 auto * meta = new Bun::NapiModuleMeta (globalObject->m_pendingNapiModuleDlopenHandle );
752752
753753 // TODO: think about the finalizer here
754- Bun::NapiExternal* napi_external = Bun::NapiExternal::create (vm, globalObject->NapiExternalStructure (), meta, nullptr , env, nullptr );
754+ Bun::NapiExternal* napi_external = Bun::NapiExternal::create (vm, globalObject->NapiExternalStructure (), meta, nullptr , nullptr , env. ptr () );
755755
756756 bool success = resultValue.getObject ()->putDirect (vm, WebCore::builtinNames (vm).napiDlopenHandlePrivateName (), napi_external, JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly);
757757 ASSERT (success);
@@ -791,7 +791,7 @@ static void wrap_cleanup(napi_env env, void* data, void* hint)
791791{
792792 auto * ref = reinterpret_cast <NapiRef*>(data);
793793 ASSERT (ref->boundCleanup != nullptr );
794- ref->boundCleanup ->deactivate (env);
794+ ref->boundCleanup ->deactivate (* env);
795795 ref->boundCleanup = nullptr ;
796796 ref->callFinalizer ();
797797}
@@ -842,7 +842,7 @@ extern "C" napi_status napi_wrap(napi_env env,
842842 NAPI_RETURN_EARLY_IF_FALSE (env, existing_wrap == nullptr , napi_invalid_arg);
843843
844844 // create a new weak reference (refcount 0)
845- auto * ref = new NapiRef (env, 0 , Bun::NapiFinalizer { finalize_cb, finalize_hint });
845+ auto * ref = new NapiRef (* env, 0 , Bun::NapiFinalizer { finalize_cb, finalize_hint });
846846 // In case the ref's finalizer is never called, we'll add a finalizer to execute on exit.
847847 const auto & bound_cleanup = env->addFinalizer (wrap_cleanup, native_object, ref);
848848 ref->boundCleanup = &bound_cleanup;
@@ -852,7 +852,7 @@ extern "C" napi_status napi_wrap(napi_env env,
852852 napi_instance->napiRef = ref;
853853 } else {
854854 // wrap the ref in an external so that it can serve as a JSValue
855- auto * external = Bun::NapiExternal::create (JSC::getVM (globalObject), globalObject->NapiExternalStructure (), ref, nullptr , env, nullptr );
855+ auto * external = Bun::NapiExternal::create (JSC::getVM (globalObject), globalObject->NapiExternalStructure (), ref, nullptr , nullptr , env );
856856 jsc_object->putDirect (vm, propertyName, JSValue (external));
857857 }
858858
@@ -1082,7 +1082,7 @@ extern "C" napi_status napi_create_reference(napi_env env, napi_value value,
10821082 can_be_weak = false ;
10831083 }
10841084
1085- auto * ref = new NapiRef (env, initial_refcount, Bun::NapiFinalizer {});
1085+ auto * ref = new NapiRef (* env, initial_refcount, Bun::NapiFinalizer {});
10861086 ref->setValueInitial (val, can_be_weak);
10871087
10881088 *result = toNapi (ref);
@@ -1119,14 +1119,14 @@ extern "C" napi_status napi_add_finalizer(napi_env env, napi_value js_object,
11191119
11201120 if (result) {
11211121 // If they're expecting a Ref, use the ref.
1122- auto * ref = new NapiRef (env, 0 , Bun::NapiFinalizer { finalize_cb, finalize_hint });
1122+ auto * ref = new NapiRef (* env, 0 , Bun::NapiFinalizer { finalize_cb, finalize_hint });
11231123 // TODO(@heimskr): consider detecting whether the value can't be weak, as we do in napi_create_reference.
11241124 ref->setValueInitial (object, true );
11251125 ref->nativeObject = native_object;
11261126 *result = toNapi (ref);
11271127 } else {
11281128 // Otherwise, it's cheaper to just call .addFinalizer.
1129- vm.heap .addFinalizer (object, [env, finalize_cb, native_object, finalize_hint](JSCell* cell) -> void {
1129+ vm.heap .addFinalizer (object, [env = WTF::Ref<NapiEnv>(*env) , finalize_cb, native_object, finalize_hint](JSCell* cell) -> void {
11301130 NAPI_LOG (" finalizer %p" , finalize_hint);
11311131 env->doFinalizer (finalize_cb, native_object, finalize_hint);
11321132 });
@@ -1991,7 +1991,7 @@ extern "C" napi_status napi_create_external_buffer(napi_env env, size_t length,
19911991
19921992 Zig::GlobalObject* globalObject = toJS (env);
19931993
1994- auto arrayBuffer = ArrayBuffer::createFromBytes ({ reinterpret_cast <const uint8_t *>(data), length }, createSharedTask<void (void *)>([env, finalize_hint, finalize_cb](void * p) {
1994+ auto arrayBuffer = ArrayBuffer::createFromBytes ({ reinterpret_cast <const uint8_t *>(data), length }, createSharedTask<void (void *)>([env = WTF::Ref<NapiEnv>(*env) , finalize_hint, finalize_cb](void * p) {
19951995 NAPI_LOG (" external buffer finalizer" );
19961996 env->doFinalizer (finalize_cb, p, finalize_hint);
19971997 }));
@@ -2303,7 +2303,7 @@ extern "C" napi_status napi_create_external(napi_env env, void* data,
23032303 JSC::VM& vm = JSC::getVM (globalObject);
23042304
23052305 auto * structure = globalObject->NapiExternalStructure ();
2306- JSValue value = Bun::NapiExternal::create (vm, structure, data, finalize_hint, env, finalize_cb );
2306+ JSValue value = Bun::NapiExternal::create (vm, structure, data, finalize_hint, finalize_cb, env );
23072307 JSC::EnsureStillAliveScope ensureStillAlive (value);
23082308 *result = toNapi (value, globalObject);
23092309 NAPI_RETURN_SUCCESS (env);
@@ -2902,4 +2902,14 @@ extern "C" bool NapiEnv__getAndClearPendingException(napi_env env, JSC::EncodedJ
29022902 return false ;
29032903}
29042904
2905+ extern " C" void NapiEnv__ref (napi_env env)
2906+ {
2907+ env->ref ();
2908+ }
2909+
2910+ extern " C" void NapiEnv__deref (napi_env env)
2911+ {
2912+ env->deref ();
2913+ }
2914+
29052915}
0 commit comments