aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/bun.js')
-rw-r--r--src/bun.js/bindings/napi.cpp47
-rw-r--r--src/bun.js/bindings/napi_external.cpp60
-rw-r--r--src/bun.js/bindings/napi_external.h93
-rw-r--r--src/bun.js/bindings/webcore/DOMClientIsoSubspaces.h1
-rw-r--r--src/bun.js/bindings/webcore/DOMIsoSubspaces.h1
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 --*/