diff options
author | 2022-11-10 15:05:06 -0800 | |
---|---|---|
committer | 2022-11-10 15:05:23 -0800 | |
commit | dddbce8a41aa266af106b19e583c152126900730 (patch) | |
tree | 0940f99ea3dca7b43764a47b5cc1e9849981da3c /src/bun.js/bindings/napi.cpp | |
parent | 7ce8328d28f415fd89cc025121b774d7a6e4661e (diff) | |
download | bun-dddbce8a41aa266af106b19e583c152126900730.tar.gz bun-dddbce8a41aa266af106b19e583c152126900730.tar.zst bun-dddbce8a41aa266af106b19e583c152126900730.zip |
Implement `napi_create_external` and `napi_get_value_external`
Diffstat (limited to 'src/bun.js/bindings/napi.cpp')
-rw-r--r-- | src/bun.js/bindings/napi.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/bun.js/bindings/napi.cpp b/src/bun.js/bindings/napi.cpp index 223808035..649b8bf50 100644 --- a/src/bun.js/bindings/napi.cpp +++ b/src/bun.js/bindings/napi.cpp @@ -50,6 +50,7 @@ #include "../modules/ObjectModule.h" #include "JavaScriptCore/JSSourceCode.h" +#include "napi_external.h" // #include <iostream> using namespace JSC; @@ -1433,3 +1434,49 @@ extern "C" napi_status napi_get_property_names(napi_env env, napi_value object, return napi_ok; } + +extern "C" napi_status napi_create_external(napi_env env, void* data, + napi_finalize finalize_cb, + void* finalize_hint, + napi_value* result) +{ + if (UNLIKELY(result == nullptr)) { + return napi_invalid_arg; + } + + Zig::GlobalObject* globalObject = toJS(env); + JSC::VM& vm = globalObject->vm(); + + auto* structure = Bun::NapiExternal::createStructure(vm, globalObject, globalObject->objectPrototype()); + JSValue value = JSValue(Bun::NapiExternal::create(vm, structure, data, finalize_hint, finalize_cb)); + JSC::EnsureStillAliveScope ensureStillAlive(value); + *result = toNapi(value); + return napi_ok; +} + +extern "C" napi_status napi_get_value_external(napi_env env, napi_value value, + void** result) +{ + if (UNLIKELY(result == nullptr)) { + return napi_invalid_arg; + } + + Zig::GlobalObject* globalObject = toJS(env); + JSC::VM& vm = globalObject->vm(); + + auto scope = DECLARE_CATCH_SCOPE(vm); + JSC::JSValue jsValue = JSC::JSValue::decode(reinterpret_cast<JSC::EncodedJSValue>(value)); + JSC::EnsureStillAliveScope ensureStillAlive(jsValue); + + if (!jsValue || !jsValue.isObject()) { + return napi_invalid_arg; + } + + JSC::JSObject* object = jsValue.getObject(); + if (!object->inherits<Bun::NapiExternal>()) { + return napi_invalid_arg; + } + + *result = jsCast<Bun::NapiExternal*>(object)->value(); + return napi_ok; +} |