aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/javascript/jsc/bindings/napi.cpp65
1 files changed, 39 insertions, 26 deletions
diff --git a/src/javascript/jsc/bindings/napi.cpp b/src/javascript/jsc/bindings/napi.cpp
index f8f4e1011..b387daf6b 100644
--- a/src/javascript/jsc/bindings/napi.cpp
+++ b/src/javascript/jsc/bindings/napi.cpp
@@ -45,6 +45,7 @@
#include "napi.h"
#include "JavaScriptCore/GetterSetter.h"
#include "JavaScriptCore/JSSourceCode.h"
+#include "JavaScriptCore/JSNativeStdFunction.h"
// #include <iostream>
using namespace JSC;
@@ -218,40 +219,49 @@ static void defineNapiProperty(Zig::GlobalObject* globalObject, JSC::JSObject* t
function->dataPtr = dataPtr;
JSC::JSValue value = JSC::JSValue(function);
- to->putDirect(vm, propertyName, value, getPropertyAttributes(property));
+ to->putDirect(vm, propertyName, value, getPropertyAttributes(property) | JSC::PropertyAttribute::Function);
return;
}
if (property.getter != nullptr || property.setter != nullptr) {
+
JSC::JSObject* getter = nullptr;
JSC::JSObject* setter = nullptr;
-
- if (property.getter) {
- auto function = Zig::JSFFIFunction::create(vm, globalObject, 0, nameStr, reinterpret_cast<Zig::FFIFunction>(property.getter));
- function->dataPtr = dataPtr;
-
- // if (isInstance) {
- // getter = JSBoundFunction::create(vm, globalObject, to, function, nullptr, 0, nullptr);
- // } else {
- getter = function;
- // }
+ auto getterProperty = reinterpret_cast<FFIFunction>(property.getter);
+ auto setterProperty = reinterpret_cast<FFIFunction>(property.setter);
+
+ if (getterProperty) {
+ JSC::JSNativeStdFunction* getterFunction = JSC::JSNativeStdFunction::create(
+ globalObject->vm(), globalObject, 0, String(), [getterProperty](JSC::JSGlobalObject* globalObject, JSC::CallFrame* callFrame) -> JSC::EncodedJSValue {
+ return getterProperty(globalObject, callFrame);
+ });
+ getter = getterFunction;
+ } else {
+ JSC::JSNativeStdFunction* getterFunction = JSC::JSNativeStdFunction::create(
+ globalObject->vm(), globalObject, 0, String(), [](JSC::JSGlobalObject* globalObject, JSC::CallFrame* callFrame) -> JSC::EncodedJSValue {
+ return JSC::JSValue::encode(JSC::jsUndefined());
+ });
+ setter = getterFunction;
}
- if (property.setter) {
- auto function = Zig::JSFFIFunction::create(vm, globalObject, 1, nameStr, reinterpret_cast<Zig::FFIFunction>(property.setter));
- function->dataPtr = dataPtr;
- // if (isInstance) {
- // setter = JSBoundFunction::create(vm, globalObject, to, function, nullptr, 1, nullptr);
- // } else {
- setter = function;
- // }
+ if (setterProperty) {
+ JSC::JSNativeStdFunction* setterFunction = JSC::JSNativeStdFunction::create(
+ globalObject->vm(), globalObject, 1, String(), [setterProperty](JSC::JSGlobalObject* globalObject, JSC::CallFrame* callFrame) -> JSC::EncodedJSValue {
+ setterProperty(globalObject, callFrame);
+ return JSC::JSValue::encode(JSC::jsBoolean(true));
+ });
+ setter = setterFunction;
+ } else {
+ JSC::JSNativeStdFunction* setterFunction = JSC::JSNativeStdFunction::create(
+ globalObject->vm(), globalObject, 1, String(), [](JSC::JSGlobalObject* globalObject, JSC::CallFrame* callFrame) -> JSC::EncodedJSValue {
+ return JSC::JSValue::encode(JSC::jsBoolean(true));
+ });
+ setter = setterFunction;
}
auto getterSetter = JSC::GetterSetter::create(vm, globalObject, getter, setter);
- to->putDirect(vm, propertyName, getterSetter, getPropertyAttributes(property));
-
+ to->putDirectAccessor(globalObject, propertyName, getterSetter, JSC::PropertyAttribute::Accessor | 0);
} else {
- // TODO: is dataPtr allowed when given a value?
JSC::JSValue value = JSC::jsUndefined();
if (property.value) {
@@ -530,7 +540,6 @@ extern "C" napi_status napi_get_cb_info(
void** data)
{
Zig::GlobalObject* globalObject = toJS(env);
- JSC::VM& vm = globalObject->vm();
auto inputArgsCount = argc == nullptr ? 0 : *argc;
JSC::CallFrame* callFrame = reinterpret_cast<JSC::CallFrame*>(cbinfo);
@@ -550,9 +559,8 @@ extern "C" napi_status napi_get_cb_info(
}
}
- JSC::JSValue thisValue = callFrame->thisValue();
-
if (this_arg != nullptr) {
+ JSC::JSValue thisValue = callFrame->thisValue();
*this_arg = toNapi(thisValue);
}
@@ -748,7 +756,12 @@ extern "C" napi_status napi_throw(napi_env env, napi_value error)
auto throwScope = DECLARE_THROW_SCOPE(vm);
JSC::JSValue value = JSC::JSValue::decode(reinterpret_cast<JSC::EncodedJSValue>(error));
- JSC::throwException(globalObject, throwScope, value);
+ if (value) {
+ JSC::throwException(globalObject, throwScope, value);
+ } else {
+ JSC::throwException(globalObject, throwScope, JSC::createError(globalObject, "Error (via napi)"_s));
+ }
+
return napi_ok;
}