aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <jarred@jarredsumner.com> 2022-05-08 01:32:20 -0700
committerGravatar Jarred Sumner <jarred@jarredsumner.com> 2022-05-08 01:32:20 -0700
commite403b6111f98ec94519bc283fa2e378485e58e5c (patch)
treea236d024302704f39cd96abb4943e335f4420dff
parentd613ba5fcd3463160008d9af86ea7843d56a1e6a (diff)
downloadbun-e403b6111f98ec94519bc283fa2e378485e58e5c.tar.gz
bun-e403b6111f98ec94519bc283fa2e378485e58e5c.tar.zst
bun-e403b6111f98ec94519bc283fa2e378485e58e5c.zip
more napi
-rw-r--r--src/javascript/jsc/base.zig4
-rw-r--r--src/javascript/jsc/bindings/napi.cpp63
-rw-r--r--src/javascript/jsc/bindings/napi.h10
-rw-r--r--src/symbols.txt15
4 files changed, 55 insertions, 37 deletions
diff --git a/src/javascript/jsc/base.zig b/src/javascript/jsc/base.zig
index 1664eca17..70570ed20 100644
--- a/src/javascript/jsc/base.zig
+++ b/src/javascript/jsc/base.zig
@@ -1215,7 +1215,7 @@ pub fn NewClassWithInstanceType(
try std.fmt.format(
writer,
\\ JSC::VM& vm = globalObject->vm();
- \\ Bun::{[name]s}* thisObject = JSC::jsDynamicCast<Bun::{[name]s}*>(vm, JSValue::decode(thisValue));
+ \\ Bun::{[name]s}* thisObject = JSC::jsDynamicCast<Bun::{[name]s}*>( JSValue::decode(thisValue));
\\ if (UNLIKELY(!thisObject)) {{
\\ return JSValue::encode(JSC::jsUndefined());
\\ }}
@@ -1265,7 +1265,7 @@ pub fn NewClassWithInstanceType(
try writer.writeAll(", (JSC::JSGlobalObject * globalObject, JSC::EncodedJSValue thisValue, JSC::EncodedJSValue value, JSC::PropertyName)) {\n");
try std.fmt.format(writer,
\\ JSC::VM& vm = globalObject->vm();
- \\ Bun::{[name]s}* thisObject = JSC::jsDynamicCast<Bun::{[name]s}*>(vm, JSValue::decode(thisValue));
+ \\ Bun::{[name]s}* thisObject = JSC::jsDynamicCast<Bun::{[name]s}*>( JSValue::decode(thisValue));
\\ if (UNLIKELY(!thisObject)) {{
\\ return false;
\\ }}
diff --git a/src/javascript/jsc/bindings/napi.cpp b/src/javascript/jsc/bindings/napi.cpp
index c8a8bb383..b7e2c8403 100644
--- a/src/javascript/jsc/bindings/napi.cpp
+++ b/src/javascript/jsc/bindings/napi.cpp
@@ -66,8 +66,8 @@ static NapiRefWeakHandleOwner& weakValueHandleOwner()
void NapiFinalizer::call(JSC::JSGlobalObject* globalObject, void* data)
{
- if (finalize_cb) {
- finalize_cb(reinterpret_cast<napi_env>(globalObject), finalize_hint, data);
+ if (this->finalize_cb) {
+ this->finalize_cb(reinterpret_cast<napi_env>(globalObject), this->finalize_hint, data);
}
}
@@ -267,8 +267,13 @@ extern "C" napi_status napi_wrap(napi_env env,
void* finalize_hint,
napi_ref* result)
{
+ if (!toJS(js_object).isObject()) {
+ return napi_object_expected;
+ }
+
auto* globalObject = toJS(env);
- auto* object = toJS(js_object).getObject();
+ auto& vm = globalObject->vm();
+ auto* val = toJS(js_object).getObject();
auto clientData = WebCore::clientData(vm);
if (native_object) {
@@ -278,35 +283,40 @@ extern "C" napi_status napi_wrap(napi_env env,
}
if (result) {
- auto* ref = new NapiRef(globalObject, object);
+ auto* ref = new NapiRef(globalObject, 0);
auto clientData = WebCore::clientData(vm);
if (finalize_cb) {
- ref->finalizer = { finalize_cb, finalize_hint };
+ ref->finalizer.finalize_cb = finalize_cb;
+ ref->finalizer.finalize_hint = finalize_hint;
}
*result = reinterpret_cast<napi_ref>(ref);
}
+
+ return napi_ok;
}
extern "C" napi_status napi_unwrap(napi_env env, napi_value js_object,
void** result)
{
+ if (!toJS(js_object).isObject()) {
+ return napi_object_expected;
+ }
auto* globalObject = toJS(env);
+ auto& vm = globalObject->vm();
auto* object = toJS(js_object).getObject();
auto clientData = WebCore::clientData(vm);
- if (native_object) {
- uintptr_t ref_ptr = reinterpret_cast<uintptr_t>(native_object);
- double ref_double = bitwise_cast<double>(ref_ptr);
- val->putDirect(vm, clientData->builtinNames().passwordPrivateName(), JSC::jsNumber(ref_double), JSC::PropertyAttribute::DontEnum | 0);
- }
-
if (result) {
- auto* ref = new NapiRef(globalObject, object);
- if (finalize_cb) {
- ref->finalizer = { finalize_cb, finalize_hint };
+ JSC::JSValue priv = object->getDirect(vm, clientData->builtinNames().passwordPrivateName());
+ if (priv.isNumber()) {
+ uintptr_t ref_ptr = bitwise_cast<uintptr_t>(priv.asNumber());
+ *result = reinterpret_cast<void*>(ref_ptr);
+ } else {
+ *result = nullptr;
}
- *result = reinterpret_cast<napi_ref>(ref);
}
+
+ return napi_ok;
}
extern "C" napi_status napi_create_function(napi_env env, const char* utf8name,
@@ -411,9 +421,17 @@ extern "C" napi_status napi_create_reference(napi_env env, napi_value value,
napi_ref* result)
{
+ JSC::JSValue val = toJS(value);
+
+ if (!val.isObject()) {
+ return napi_object_expected;
+ }
+
Zig::GlobalObject* globalObject = reinterpret_cast<Zig::GlobalObject*>(env);
+ JSC::VM& vm = globalObject->vm();
+
auto* ref = new NapiRef(toJS(env), initial_refcount);
- JSC::JSValue val = toJS(value);
+
auto clientData = WebCore::clientData(vm);
if (initial_refcount > 0) {
@@ -430,7 +448,7 @@ extern "C" napi_status napi_create_reference(napi_env env, napi_value value,
uintptr_t ref_ptr = reinterpret_cast<uintptr_t>(ref);
double ref_double = bitwise_cast<double>(ref_ptr);
- val->putDirect(vm, clientData->builtinNames().passwordPrivateName(), JSC::jsNumber(ref_double), JSC::PropertyAttribute::DontEnum | 0);
+ val.getObject()->putDirect(vm, clientData->builtinNames().passwordPrivateName(), JSC::jsNumber(ref_double), JSC::PropertyAttribute::DontEnum | 0);
*result = toNapi(ref);
@@ -466,19 +484,10 @@ extern "C" napi_status napi_reference_ref(napi_env env, napi_ref ref,
return napi_ok;
}
-extern "C" napi_status napi_reference_delete(napi_env env, napi_ref ref,
- uint32_t* result)
-{
- NapiRef* napiRef = toJS(ref);
- napiRef->ref();
- *result = napiRef->refCount();
- return napi_ok;
-}
-
extern "C" napi_status napi_delete_reference(napi_env env, napi_ref ref)
{
NapiRef* napiRef = toJS(ref);
- ~napiRef();
+ napiRef->~NapiRef();
return napi_ok;
}
diff --git a/src/javascript/jsc/bindings/napi.h b/src/javascript/jsc/bindings/napi.h
index e547b22fa..7e7ba123d 100644
--- a/src/javascript/jsc/bindings/napi.h
+++ b/src/javascript/jsc/bindings/napi.h
@@ -80,15 +80,15 @@ public:
return JSC::JSValue {};
}
- if (weakValue.isString()) {
- return JSC::JSValue(weakValue.string());
+ if (weakValueRef.isString()) {
+ return JSC::JSValue(weakValueRef.string());
}
- if (weakValue.isObject()) {
- return JSC::JSValue(weakValue.object());
+ if (weakValueRef.isObject()) {
+ return JSC::JSValue(weakValueRef.object());
}
- return weakValue.primitive();
+ return weakValueRef.primitive();
}
return strongRef.get();
diff --git a/src/symbols.txt b/src/symbols.txt
index 42b6312e1..b280ca344 100644
--- a/src/symbols.txt
+++ b/src/symbols.txt
@@ -108,7 +108,16 @@ _napi_throw_range_error
_napi_throw_type_error
_napi_typeof
_napi_unref_threadsafe_function
-#_napi_coerce_to_string
+_napi_coerce_to_string
#_napi_delete_element
-#_napi_get_property_names
-#_napi_make_callback \ No newline at end of file
+_napi_get_all_property_names
+#_napi_make_callback
+_napi_define_class
+_napi_create_type_error
+_napi_define_properties
+_napi_wrap
+_napi_unwrap
+_napi_reference_unref
+_napi_reference_ref
+_napi_get_reference_value
+_napi_delete_reference \ No newline at end of file