From bab317edd169b160712fcc2f6e56cb36dceec0f5 Mon Sep 17 00:00:00 2001 From: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> Date: Sat, 1 Oct 2022 13:23:32 -0700 Subject: [PATCH] [napi] Implement `napi_remove_wrap` --- src/bun.js/bindings/napi.cpp | 30 ++++++++++++++++++++++++++++++ src/symbols.dyn | 1 + src/symbols.txt | 1 + 3 files changed, 32 insertions(+) diff --git a/src/bun.js/bindings/napi.cpp b/src/bun.js/bindings/napi.cpp index 4acd52d8a3..223808035e 100644 --- a/src/bun.js/bindings/napi.cpp +++ b/src/bun.js/bindings/napi.cpp @@ -575,6 +575,36 @@ extern "C" napi_status napi_wrap(napi_env env, return napi_ok; } +extern "C" napi_status napi_remove_wrap(napi_env env, napi_value js_object, + void** result) +{ + JSValue value = toJS(js_object); + if (!value || value.isUndefinedOrNull()) { + return napi_object_expected; + } + + auto* globalObject = toJS(env); + auto& vm = globalObject->vm(); + auto* val = jsDynamicCast(value); + + if (!val) { + return napi_object_expected; + } + + if (!val->napiRef) { + // not sure if this should succeed or return an error + return napi_ok; + } + + *result = val->napiRef->data; + + auto* ref = val->napiRef; + val->napiRef = nullptr; + delete ref; + + return napi_ok; +} + extern "C" napi_status napi_unwrap(napi_env env, napi_value js_object, void** result) { diff --git a/src/symbols.dyn b/src/symbols.dyn index 0e02635bcf..d811666235 100644 --- a/src/symbols.dyn +++ b/src/symbols.dyn @@ -125,4 +125,5 @@ _napi_unref_threadsafe_function; _napi_unwrap; _napi_wrap; + _napi_remove_wrap; }; \ No newline at end of file diff --git a/src/symbols.txt b/src/symbols.txt index 1a570556f5..7367f15493 100644 --- a/src/symbols.txt +++ b/src/symbols.txt @@ -124,3 +124,4 @@ _napi_typeof _napi_unref_threadsafe_function _napi_unwrap _napi_wrap +_napi_remove_wrap