diff options
author | 2022-05-04 22:14:02 -0700 | |
---|---|---|
committer | 2022-05-05 21:35:08 -0700 | |
commit | 2c0c91e2d0eb7749abf9dec4a4f2ce123c1ac8f2 (patch) | |
tree | 5406b72ceccc188f5e015388b676c67f12bdccee /src | |
parent | 6b976802248239c6ac514849f11a83837d6c1dea (diff) | |
download | bun-2c0c91e2d0eb7749abf9dec4a4f2ce123c1ac8f2.tar.gz bun-2c0c91e2d0eb7749abf9dec4a4f2ce123c1ac8f2.tar.zst bun-2c0c91e2d0eb7749abf9dec4a4f2ce123c1ac8f2.zip |
more
Diffstat (limited to 'src')
-rw-r--r-- | src/javascript/jsc/bindings/bindings.zig | 7 | ||||
-rw-r--r-- | src/napi/napi.zig | 58 |
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)}; |