diff options
author | 2022-11-19 01:18:58 -0800 | |
---|---|---|
committer | 2022-11-19 01:18:58 -0800 | |
commit | 68b55cd855249964fbb9b9d74d1303cae9993904 (patch) | |
tree | 682044fe4404736e6e6dd970390f1ac07fe942d3 /src | |
parent | 43b4e1b67bad69ac4da193ea2ac603b1a985839e (diff) | |
download | bun-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.h | 7 | ||||
-rw-r--r-- | src/bun.js/bindings/napi.cpp | 28 | ||||
-rw-r--r-- | src/napi/napi.zig | 2 |
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); } |