aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-11-19 01:18:58 -0800
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-11-19 01:18:58 -0800
commit68b55cd855249964fbb9b9d74d1303cae9993904 (patch)
tree682044fe4404736e6e6dd970390f1ac07fe942d3 /src
parent43b4e1b67bad69ac4da193ea2ac603b1a985839e (diff)
downloadbun-68b55cd855249964fbb9b9d74d1303cae9993904.tar.gz
bun-68b55cd855249964fbb9b9d74d1303cae9993904.tar.zst
bun-68b55cd855249964fbb9b9d74d1303cae9993904.zip
Implement a singleton version of `napi_get_instance_data` and `napi_set_instance_data`
Still need to figure out how to do this without adding a layer of indirection to the global object as exposed to NAPI Addons This code is not tested
Diffstat (limited to 'src')
-rw-r--r--src/bun.js/bindings/ZigGlobalObject.h7
-rw-r--r--src/bun.js/bindings/napi.cpp28
-rw-r--r--src/napi/napi.zig2
3 files changed, 37 insertions, 0 deletions
diff --git a/src/bun.js/bindings/ZigGlobalObject.h b/src/bun.js/bindings/ZigGlobalObject.h
index 142065e35..1aee587cf 100644
--- a/src/bun.js/bindings/ZigGlobalObject.h
+++ b/src/bun.js/bindings/ZigGlobalObject.h
@@ -423,6 +423,13 @@ public:
// To do that, we count the number of times we register a module.
int napiModuleRegisterCallCount = 0;
+ // NAPI instance data
+ // This is not a correct implementation
+ // Addon modules can override each other's data
+ void* napiInstanceData = nullptr;
+ void* napiInstanceDataFinalizer = nullptr;
+ void* napiInstanceDataFinalizerHint = nullptr;
+
#include "ZigGeneratedClasses+lazyStructureHeader.h"
private:
diff --git a/src/bun.js/bindings/napi.cpp b/src/bun.js/bindings/napi.cpp
index 649b8bf50..943f37688 100644
--- a/src/bun.js/bindings/napi.cpp
+++ b/src/bun.js/bindings/napi.cpp
@@ -1480,3 +1480,31 @@ extern "C" napi_status napi_get_value_external(napi_env env, napi_value value,
*result = jsCast<Bun::NapiExternal*>(object)->value();
return napi_ok;
}
+
+// TODO: make this per addon instead of globally shared for ALL addons
+extern "C" napi_status napi_get_instance_data(napi_env env,
+ void** data)
+{
+ Zig::GlobalObject* globalObject = toJS(env);
+ if (data == nullptr) {
+ return napi_invalid_arg;
+ }
+
+ *data = globalObject->napiInstanceData;
+ return napi_ok;
+}
+
+extern "C" napi_status napi_set_instance_data(napi_env env,
+ void* data,
+ napi_finalize finalize_cb,
+ void* finalize_hint)
+{
+ Zig::GlobalObject* globalObject = toJS(env);
+ if (data)
+ globalObject->napiInstanceData = data;
+
+ globalObject->napiInstanceDataFinalizer = reinterpret_cast<void*>(finalize_cb);
+ globalObject->napiInstanceDataFinalizerHint = finalize_hint;
+
+ return napi_ok;
+} \ No newline at end of file
diff --git a/src/napi/napi.zig b/src/napi/napi.zig
index 260e5ba22..d7c7562b9 100644
--- a/src/napi/napi.zig
+++ b/src/napi/napi.zig
@@ -1508,6 +1508,8 @@ pub fn fixDeadCodeElimination() void {
std.mem.doNotOptimizeAway(&napi_add_finalizer);
std.mem.doNotOptimizeAway(&napi_create_external);
std.mem.doNotOptimizeAway(&napi_get_value_external);
+ std.mem.doNotOptimizeAway(&napi_get_instance_data);
+ std.mem.doNotOptimizeAway(&napi_set_instance_data);
std.mem.doNotOptimizeAway(&@import("../bun.js/node/buffer.zig").BufferVectorized.fill);
}