aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/bindings/napi.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/bun.js/bindings/napi.cpp')
-rw-r--r--src/bun.js/bindings/napi.cpp41
1 files changed, 32 insertions, 9 deletions
diff --git a/src/bun.js/bindings/napi.cpp b/src/bun.js/bindings/napi.cpp
index 97f3222c9..a859e3ac5 100644
--- a/src/bun.js/bindings/napi.cpp
+++ b/src/bun.js/bindings/napi.cpp
@@ -554,6 +554,8 @@ extern "C" napi_status napi_wrap(napi_env env,
auto* globalObject = toJS(env);
auto& vm = globalObject->vm();
+
+
auto* val = jsDynamicCast<NapiPrototype*>(value);
if (!val) {
@@ -569,8 +571,8 @@ extern "C" napi_status napi_wrap(napi_env env,
auto clientData = WebCore::clientData(vm);
- auto* ref = new NapiRef(globalObject, 0);
- ref->weakValueRef.setObject(val, weakValueHandleOwner(), ref);
+ auto* ref = new NapiRef(globalObject, 1);
+ ref->strongRef.set(globalObject->vm(), value.getObject());
if (finalize_cb) {
ref->finalizer.finalize_cb = finalize_cb;
@@ -584,7 +586,7 @@ extern "C" napi_status napi_wrap(napi_env env,
val->napiRef = ref;
if (result) {
- *result = reinterpret_cast<napi_ref>(ref);
+ *result = toNapi(ref);
}
return napi_ok;
@@ -623,12 +625,14 @@ extern "C" napi_status napi_remove_wrap(napi_env env, napi_value js_object,
extern "C" napi_status napi_unwrap(napi_env env, napi_value js_object,
void** result)
{
- if (!toJS(js_object).isObject()) {
+ JSValue value = toJS(js_object);
+
+ if (!value.isObject()) {
return NAPI_OBJECT_EXPECTED;
}
auto* globalObject = toJS(env);
auto& vm = globalObject->vm();
- auto* object = JSC::jsDynamicCast<NapiPrototype*>(toJS(js_object));
+ auto* object = JSC::jsDynamicCast<NapiPrototype*>(value);
auto clientData = WebCore::clientData(vm);
if (object) {
@@ -793,10 +797,13 @@ extern "C" napi_status napi_create_reference(napi_env env, napi_value value,
Zig::GlobalObject* globalObject = toJS(env);
JSC::VM& vm = globalObject->vm();
- auto* ref = new NapiRef(toJS(env), initial_refcount);
-
+ NapiPrototype* object = jsDynamicCast<NapiPrototype*>(val);
+ if (object && object->napiRef) {
+ *result = toNapi(object->napiRef);
+ return napi_ok;
+ }
auto clientData = WebCore::clientData(vm);
-
+ auto* ref = new NapiRef(globalObject, initial_refcount);
if (initial_refcount > 0) {
ref->strongRef.set(globalObject->vm(), val);
} else {
@@ -809,7 +816,7 @@ extern "C" napi_status napi_create_reference(napi_env env, napi_value value,
}
}
- if (NapiPrototype* object = jsDynamicCast<NapiPrototype*>(val)) {
+ if(object) {
object->napiRef = ref;
}
@@ -1467,6 +1474,22 @@ extern "C" napi_status napi_get_property_names(napi_env env, napi_value object,
return napi_ok;
}
+extern "C" napi_status napi_create_object(napi_env env, napi_value* result){
+
+ if (UNLIKELY(result == nullptr)) {
+ return napi_invalid_arg;
+ }
+
+ Zig::GlobalObject* globalObject = toJS(env);
+ JSC::VM& vm = globalObject->vm();
+
+ JSValue value = JSValue(NapiPrototype::create(vm, globalObject));
+
+ *result = toNapi(value);
+ JSC::EnsureStillAliveScope ensureStillAlive(value);
+
+ return napi_ok;
+}
extern "C" napi_status napi_create_external(napi_env env, void* data,
napi_finalize finalize_cb,
void* finalize_hint,