mirror of
https://github.com/oven-sh/bun
synced 2026-02-16 13:51:47 +00:00
Move napi_new_instance to c++ (#12658)
Co-authored-by: Jarred-Sumner <Jarred-Sumner@users.noreply.github.com> Co-authored-by: Dylan Conway <35280289+dylan-conway@users.noreply.github.com>
This commit is contained in:
@@ -2543,6 +2543,42 @@ extern "C" napi_status napi_create_symbol(napi_env env, napi_value description,
|
||||
return napi_ok;
|
||||
}
|
||||
|
||||
// https://github.com/nodejs/node/blob/2eff28fb7a93d3f672f80b582f664a7c701569fb/src/js_native_api_v8.cc#L2904-L2930
|
||||
extern "C" napi_status napi_new_instance(napi_env env, napi_value constructor,
|
||||
size_t argc, const napi_value* argv,
|
||||
napi_value* result)
|
||||
{
|
||||
NAPI_PREMABLE
|
||||
if (UNLIKELY(!result)) {
|
||||
return napi_invalid_arg;
|
||||
}
|
||||
|
||||
Zig::GlobalObject* globalObject = toJS(env);
|
||||
JSC::VM& vm = globalObject->vm();
|
||||
auto throwScope = DECLARE_THROW_SCOPE(vm);
|
||||
|
||||
JSC::JSValue constructorValue = toJS(constructor);
|
||||
if (UNLIKELY(!constructorValue.isObject())) {
|
||||
return napi_function_expected;
|
||||
}
|
||||
|
||||
JSC::JSObject* constructorObject = constructorValue.getObject();
|
||||
JSC::CallData constructData = getConstructData(constructorObject);
|
||||
if (UNLIKELY(constructData.type == JSC::CallData::Type::None)) {
|
||||
return napi_function_expected;
|
||||
}
|
||||
|
||||
JSC::MarkedArgumentBuffer args;
|
||||
args.fill(vm, argc, [&](auto* slot) {
|
||||
memcpy(slot, argv, sizeof(JSC::JSValue) * argc);
|
||||
});
|
||||
|
||||
auto value = construct(globalObject, constructorObject, constructData, args);
|
||||
RETURN_IF_EXCEPTION(throwScope, napi_pending_exception);
|
||||
*result = toNapi(value);
|
||||
|
||||
RELEASE_AND_RETURN(throwScope, napi_ok);
|
||||
}
|
||||
extern "C" napi_status napi_call_function(napi_env env, napi_value recv_napi,
|
||||
napi_value func_napi, size_t argc,
|
||||
const napi_value* argv,
|
||||
|
||||
@@ -648,37 +648,7 @@ pub export fn napi_strict_equals(env: napi_env, lhs: napi_value, rhs: napi_value
|
||||
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 export fn napi_new_instance(env: napi_env, constructor: napi_value, argc: usize, argv: [*c]const napi_value, result_: ?*napi_value) napi_status {
|
||||
log("napi_new_instance", .{});
|
||||
JSC.markBinding(@src());
|
||||
|
||||
if (argc > 0 and argv == null) {
|
||||
return invalidArg();
|
||||
}
|
||||
|
||||
const result = result_ orelse {
|
||||
return invalidArg();
|
||||
};
|
||||
|
||||
var exception = [_]JSC.C.JSValueRef{null};
|
||||
result.* = JSValue.c(
|
||||
JSC.C.JSObjectCallAsConstructor(
|
||||
env.ref(),
|
||||
constructor.asObjectRef(),
|
||||
argc,
|
||||
if (argv != null)
|
||||
@as([*]const JSC.C.JSValueRef, @ptrCast(argv))
|
||||
else
|
||||
null,
|
||||
&exception,
|
||||
),
|
||||
);
|
||||
if (exception[0] != null) {
|
||||
return genericFailure();
|
||||
}
|
||||
|
||||
return .ok;
|
||||
}
|
||||
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 export fn napi_instanceof(env: napi_env, object: napi_value, constructor: napi_value, result_: ?*bool) napi_status {
|
||||
log("napi_instanceof", .{});
|
||||
const result = result_ orelse {
|
||||
|
||||
Reference in New Issue
Block a user