aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/bindings/napi.cpp
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-11-10 15:05:06 -0800
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-11-10 15:05:23 -0800
commitdddbce8a41aa266af106b19e583c152126900730 (patch)
tree0940f99ea3dca7b43764a47b5cc1e9849981da3c /src/bun.js/bindings/napi.cpp
parent7ce8328d28f415fd89cc025121b774d7a6e4661e (diff)
downloadbun-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.cpp47
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;
+}