diff options
author | 2022-05-06 06:43:49 -0700 | |
---|---|---|
committer | 2022-05-06 06:43:49 -0700 | |
commit | 1687455a3fe22225bf18f97620d6d9b75c3e5a47 (patch) | |
tree | a186285dd15c8dc0edd98c657930b69014aa578c /src | |
parent | 84e40a4f74f9d7a79fcdef3bc114e41eb8bb49af (diff) | |
download | bun-1687455a3fe22225bf18f97620d6d9b75c3e5a47.tar.gz bun-1687455a3fe22225bf18f97620d6d9b75c3e5a47.tar.zst bun-1687455a3fe22225bf18f97620d6d9b75c3e5a47.zip |
[napi] Fix function arguments
Diffstat (limited to 'src')
-rw-r--r-- | src/javascript/jsc/bindings/napi.cpp | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/src/javascript/jsc/bindings/napi.cpp b/src/javascript/jsc/bindings/napi.cpp index 13ec61a53..027609ec7 100644 --- a/src/javascript/jsc/bindings/napi.cpp +++ b/src/javascript/jsc/bindings/napi.cpp @@ -118,16 +118,31 @@ extern "C" napi_status napi_get_cb_info( Zig::GlobalObject* globalObject = reinterpret_cast<Zig::GlobalObject*>(env); JSC::VM& vm = globalObject->vm(); JSC::CallFrame* callFrame = reinterpret_cast<JSC::CallFrame*>(cbinfo); - JSC::JSValue thisValue = callFrame->thisValue(); - *argc = callFrame->argumentCount(); - **reinterpret_cast<JSC::EncodedJSValue***>(argv) = reinterpret_cast<JSC::EncodedJSValue*>(callFrame->addressOfArgumentsStart()); - if (thisValue && this_arg != nullptr) { + + auto inputArgsCount = argc == nullptr ? 0 : *argc; + + if (inputArgsCount > 0) { + auto outputArgsCount = callFrame->argumentCount(); + auto argsToCopy = inputArgsCount < outputArgsCount ? inputArgsCount : outputArgsCount; + *argc = argsToCopy; + + memcpy(argv, callFrame->addressOfArgumentsStart(), argsToCopy * sizeof(JSC::JSValue)); + auto argv_ptr = argv[outputArgsCount]; + for (size_t i = outputArgsCount; i < inputArgsCount; i++) { + argv[i] = reinterpret_cast<napi_value>(JSC::JSValue::encode(JSC::jsUndefined())); + } + } + + if (this_arg != nullptr) { + JSC::JSValue thisValue = callFrame->thisValue(); *this_arg = reinterpret_cast<napi_value>(JSC::JSValue::encode(thisValue)); } - Zig::JSFFIFunction* ffiFunction = JSC::jsDynamicCast<Zig::JSFFIFunction*>(vm, JSC::JSValue(callFrame->jsCallee())); - if (data != nullptr) + if (data != nullptr) { + Zig::JSFFIFunction* ffiFunction = JSC::jsDynamicCast<Zig::JSFFIFunction*>(vm, JSC::JSValue(callFrame->jsCallee())); *data = reinterpret_cast<void*>(ffiFunction->dataPtr); + } + return napi_ok; } |