diff options
Diffstat (limited to 'src/bun.js')
-rw-r--r-- | src/bun.js/bindings/napi.cpp | 47 | ||||
-rw-r--r-- | src/bun.js/bindings/napi_external.cpp | 60 | ||||
-rw-r--r-- | src/bun.js/bindings/napi_external.h | 93 | ||||
-rw-r--r-- | src/bun.js/bindings/webcore/DOMClientIsoSubspaces.h | 1 | ||||
-rw-r--r-- | src/bun.js/bindings/webcore/DOMIsoSubspaces.h | 1 |
5 files changed, 116 insertions, 86 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; +} diff --git a/src/bun.js/bindings/napi_external.cpp b/src/bun.js/bindings/napi_external.cpp index 15e46aa97..eb5786b6f 100644 --- a/src/bun.js/bindings/napi_external.cpp +++ b/src/bun.js/bindings/napi_external.cpp @@ -1,50 +1,20 @@ +#include "napi_external.h" +#include "napi.h" +namespace Bun { -// #pragma once +NapiExternal::~NapiExternal() +{ + if (finalizer) { + finalizer(toNapi(globalObject()), m_value, m_finalizerHint); + } +} -// #include "root.h" +void NapiExternal::destroy(JSC::JSCell* cell) +{ + jsCast<NapiExternal*>(cell)->~NapiExternal(); +} -// #include "BunBuiltinNames.h" -// #include "BunClientData.h" +const ClassInfo NapiExternal::s_info = { "External"_s, &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(NapiExternal) }; -// namespace Zig { - -// using namespace JSC; - -// class NapiExternal : public JSC::JSNonFinalObject { -// using Base = JSC::JSNonFinalObject; - -// public: -// NapiExternal(JSC::VM& vm, JSC::Structure* structure) -// : Base(vm, structure) -// { -// } - -// DECLARE_INFO; - -// static constexpr unsigned StructureFlags = Base::StructureFlags; - -// template<typename CellType, SubspaceAccess> static GCClient::IsoSubspace* subspaceFor(VM& vm) -// { -// return &vm.plainObjectSpace(); -// } - -// static JSC::Structure* createStructure(JSC::VM& vm, JSC::JSGlobalObject* globalObject, -// JSC::JSValue prototype) -// { -// return JSC::Structure::create(vm, globalObject, prototype, -// JSC::TypeInfo(JSC::ObjectType, StructureFlags), info()); -// } - -// static NapiExternal* create(JSC::VM& vm, JSC::Structure* structure) -// { -// NapiExternal* accessor = new (NotNull, JSC::allocateCell<NapiExternal>(vm)) NapiExternal(vm, structure); -// accessor->finishCreation(vm); -// return accessor; -// } - -// void finishCreation(JSC::VM& vm); -// void* m_value; -// }; - -// } // namespace Zig
\ No newline at end of file +}
\ No newline at end of file diff --git a/src/bun.js/bindings/napi_external.h b/src/bun.js/bindings/napi_external.h index edac914f8..8090281fe 100644 --- a/src/bun.js/bindings/napi_external.h +++ b/src/bun.js/bindings/napi_external.h @@ -6,13 +6,15 @@ #include "BunBuiltinNames.h" #include "BunClientData.h" +#include "node_api.h" -namespace Zig { +namespace Bun { using namespace JSC; +using namespace WebCore; -class NapiExternal : public JSC::JSNonFinalObject { - using Base = JSC::JSNonFinalObject; +class NapiExternal : public JSC::JSDestructibleObject { + using Base = JSC::JSDestructibleObject; public: NapiExternal(JSC::VM& vm, JSC::Structure* structure) @@ -20,45 +22,54 @@ public: { } - DECLARE_INFO; + DECLARE_EXPORT_INFO; - ~NapiExternal() + static constexpr unsigned StructureFlags = Base::StructureFlags; + + template<typename, JSC::SubspaceAccess mode> static JSC::GCClient::IsoSubspace* subspaceFor(JSC::VM& vm) + { + if constexpr (mode == JSC::SubspaceAccess::Concurrently) + return nullptr; + + return WebCore::subspaceForImpl<NapiExternal, UseCustomHeapCellType::No>( + vm, + [](auto& spaces) { return spaces.m_clientSubspaceForNapiExternal.get(); }, + [](auto& spaces, auto&& space) { spaces.m_clientSubspaceForNapiExternal = WTFMove(space); }, + [](auto& spaces) { return spaces.m_subspaceForNapiExternal.get(); }, + [](auto& spaces, auto&& space) { spaces.m_subspaceForNapiExternal = WTFMove(space); }); + } + + ~NapiExternal(); + + static JSC::Structure* createStructure(JSC::VM& vm, JSC::JSGlobalObject* globalObject, + JSC::JSValue prototype) + { + return JSC::Structure::create(vm, globalObject, prototype, + JSC::TypeInfo(JSC::ObjectType, StructureFlags), info()); + } + + static NapiExternal* create(JSC::VM& vm, JSC::Structure* structure, void* value, void* finalizer_hint, napi_finalize finalizer) { - if (m_value) { - delete m_value; - } - - static constexpr unsigned StructureFlags = Base::StructureFlags; - - template<typename, SubspaceAccess mode> static JSC::GCClient::IsoSubspace* subspaceFor(JSC::VM & vm) - { - if constexpr (mode == JSC::SubspaceAccess::Concurrently) - return nullptr; - return WebCore::subspaceForImpl<JSNapiExternal, WebCore::UseCustomHeapCellType::No>( - vm, - [](auto& spaces) { return spaces.m_clientSubspaceForNapiExternal.get(); }, - [](auto& spaces, auto&& space) { spaces.m_clientSubspaceForNapiExternal = WTFMove(space); }, - [](auto& spaces) { return spaces.m_subspaceForNapiExternal.get(); }, - [](auto& spaces, auto&& space) { spaces.m_subspaceForNapiExternal = WTFMove(space); }); - } - - static JSC::Structure* createStructure(JSC::VM & vm, JSC::JSGlobalObject * globalObject, - JSC::JSValue prototype) - { - return JSC::Structure::create(vm, globalObject, prototype, - JSC::TypeInfo(JSC::ObjectType, StructureFlags), info()); - } - - static NapiExternal* create(JSC::VM & vm, JSC::Structure * structure) - { - NapiExternal* accessor = new (NotNull, JSC::allocateCell<NapiExternal>(vm)) NapiExternal(vm, structure); - accessor->finishCreation(vm); - return accessor; - } - - void finishCreation(JSC::VM & vm); - void* m_value; - void* finalizer_context; - }; + NapiExternal* accessor = new (NotNull, JSC::allocateCell<NapiExternal>(vm)) NapiExternal(vm, structure); + accessor->finishCreation(vm, value, finalizer_hint, finalizer); + return accessor; + } + + void finishCreation(JSC::VM& vm, void* value, void* finalizer_hint, napi_finalize finalizer) + { + Base::finishCreation(vm); + m_value = value; + m_finalizerHint = finalizer_hint; + this->finalizer = finalizer; + } + + static void destroy(JSC::JSCell* cell); + + void* value() const { return m_value; } + + void* m_value; + void* m_finalizerHint; + napi_finalize finalizer; +}; } // namespace Zig
\ No newline at end of file diff --git a/src/bun.js/bindings/webcore/DOMClientIsoSubspaces.h b/src/bun.js/bindings/webcore/DOMClientIsoSubspaces.h index cd292d938..e7504c024 100644 --- a/src/bun.js/bindings/webcore/DOMClientIsoSubspaces.h +++ b/src/bun.js/bindings/webcore/DOMClientIsoSubspaces.h @@ -31,6 +31,7 @@ public: std::unique_ptr<GCClient::IsoSubspace> m_clientSubspaceForPendingVirtualModuleResult; std::unique_ptr<GCClient::IsoSubspace> m_clientSubspaceForOnigurumaRegExp; std::unique_ptr<GCClient::IsoSubspace> m_clientSubspaceForCallSite; + std::unique_ptr<GCClient::IsoSubspace> m_clientSubspaceForNapiExternal; #include "ZigGeneratedClasses+DOMClientIsoSubspaces.h" /* --- bun --- */ diff --git a/src/bun.js/bindings/webcore/DOMIsoSubspaces.h b/src/bun.js/bindings/webcore/DOMIsoSubspaces.h index 568b4e978..cba631c61 100644 --- a/src/bun.js/bindings/webcore/DOMIsoSubspaces.h +++ b/src/bun.js/bindings/webcore/DOMIsoSubspaces.h @@ -31,6 +31,7 @@ public: std::unique_ptr<IsoSubspace> m_subspaceForPendingVirtualModuleResult; std::unique_ptr<IsoSubspace> m_subspaceForOnigurumaRegExp; std::unique_ptr<IsoSubspace> m_subspaceForCallSite; + std::unique_ptr<IsoSubspace> m_subspaceForNapiExternal; #include "ZigGeneratedClasses+DOMIsoSubspaces.h" /*-- BUN --*/ |