aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <jarred@jarredsumner.com> 2022-05-04 22:14:02 -0700
committerGravatar Jarred Sumner <jarred@jarredsumner.com> 2022-05-05 21:35:08 -0700
commit2c0c91e2d0eb7749abf9dec4a4f2ce123c1ac8f2 (patch)
tree5406b72ceccc188f5e015388b676c67f12bdccee /src
parent6b976802248239c6ac514849f11a83837d6c1dea (diff)
downloadbun-2c0c91e2d0eb7749abf9dec4a4f2ce123c1ac8f2.tar.gz
bun-2c0c91e2d0eb7749abf9dec4a4f2ce123c1ac8f2.tar.zst
bun-2c0c91e2d0eb7749abf9dec4a4f2ce123c1ac8f2.zip
more
Diffstat (limited to 'src')
-rw-r--r--src/javascript/jsc/bindings/bindings.zig7
-rw-r--r--src/napi/napi.zig58
2 files changed, 61 insertions, 4 deletions
diff --git a/src/javascript/jsc/bindings/bindings.zig b/src/javascript/jsc/bindings/bindings.zig
index 7732a27e3..a496ec174 100644
--- a/src/javascript/jsc/bindings/bindings.zig
+++ b/src/javascript/jsc/bindings/bindings.zig
@@ -2281,6 +2281,13 @@ pub const JSValue = enum(u64) {
};
}
+ pub fn isInstanceOf(this: JSValue, global: *JSGlobalObject, constructor: JSValue) bool {
+ if (this.isEmptyOrUndefinedOrNull())
+ return false;
+
+ return JSC.C.JSValueIsInstanceOfConstructor(global.ref(), this.asObjectRef(), constructor.ref(), null);
+ }
+
pub fn jsType(
this: JSValue,
) JSType {
diff --git a/src/napi/napi.zig b/src/napi/napi.zig
index 3a7236263..b52593f25 100644
--- a/src/napi/napi.zig
+++ b/src/napi/napi.zig
@@ -570,9 +570,46 @@ pub export fn napi_strict_equals(env: napi_env, lhs: napi_value, rhs: napi_value
result.* = lhs.isSameValue(rhs, env);
return .ok;
}
-pub extern fn napi_call_function(env: napi_env, recv: napi_value, func: napi_value, argc: usize, argv: [*c]const napi_value, result: *napi_value) napi_status;
-pub extern fn napi_new_instance(env: napi_env, constructor: napi_value, argc: usize, argv: [*c]const napi_value, result: *napi_value) napi_status;
-pub extern fn napi_instanceof(env: napi_env, object: napi_value, constructor: napi_value, result: *bool) napi_status;
+pub export fn napi_call_function(env: napi_env, recv: napi_value, func: napi_value, argc: usize, argv: [*c]const napi_value, result: *napi_value) napi_status {
+ var exception = [_]JSC.C.JSValueRef{null};
+ result.* = JSValue.c(
+ JSC.C.JSObjectCallAsFunctionReturnValue(
+ env.ref(),
+ func.asObjectRef(),
+ recv.asObjectRef(),
+ argc,
+ @ptrCast([*]const JSC.C.JSValueRef, argv),
+ &exception,
+ ),
+ );
+ if (exception.* != null) {
+ return .generic_failure;
+ }
+
+ return .ok;
+}
+pub export fn napi_new_instance(env: napi_env, constructor: napi_value, argc: usize, argv: [*c]const napi_value, result: *napi_value) napi_status {
+ var exception = [_]JSC.C.JSValueRef{null};
+ result.* = JSValue.c(
+ JSC.C.JSObjectCallAsConstructor(
+ env.ref(),
+ constructor.asObjectRef(),
+ argc,
+ @ptrCast([*]const JSC.C.JSValueRef, argv),
+ &exception,
+ ),
+ );
+ if (exception.* != null) {
+ return .generic_failure;
+ }
+
+ return .ok;
+}
+pub export fn napi_instanceof(env: napi_env, object: napi_value, constructor: napi_value, result: *bool) napi_status {
+ // TODO: does this throw object_expected in node?
+ result.* = object.isInstanceOf(env, constructor);
+ return .ok;
+}
pub extern fn napi_get_cb_info(env: napi_env, cbinfo: napi_callback_info, argc: [*c]usize, argv: *napi_value, this_arg: *napi_value, data: [*]*anyopaque) napi_status;
pub extern fn napi_get_new_target(env: napi_env, cbinfo: napi_callback_info, result: *napi_value) napi_status;
pub extern fn napi_define_class(env: napi_env, utf8name: [*c]const u8, length: usize, constructor: napi_callback, data: ?*anyopaque, property_count: usize, properties: [*c]const napi_property_descriptor, result: *napi_value) napi_status;
@@ -712,7 +749,20 @@ pub export fn napi_is_promise(_: napi_env, value: napi_value, is_promise: *bool)
is_promise.* = value.asPromise() != null or value.asInternalPromise() != null;
return .ok;
}
-pub extern fn napi_run_script(env: napi_env, script: napi_value, result: *napi_value) napi_status;
+pub export fn napi_run_script(env: napi_env, script: napi_value, result: *napi_value) napi_status {
+ // TODO: don't copy
+ var ref = JSC.C.JSValueToStringCopy(env, script.asObjectRef(), TODO_EXCEPTION);
+ defer JSC.C.JSStringRelease(ref);
+
+ var exception = [_]JSC.C.JSValueRef{null};
+ const val = JSC.C.JSEvaluateScript(env.ref(), script, env, null, 0, &exception);
+ if (exception[0] != null) {
+ return .generic_failure;
+ }
+
+ result.* = JSValue.c(val);
+ return .ok;
+}
pub extern fn napi_adjust_external_memory(env: napi_env, change_in_bytes: i64, adjusted_value: [*c]i64) napi_status;
pub export fn napi_create_date(env: napi_env, time: f64, result: *napi_value) napi_status {
var args = [_]JSC.C.JSValueRef{JSC.JSValue.jsNumber(time)};