diff options
author | 2022-11-02 13:30:40 -0700 | |
---|---|---|
committer | 2022-11-02 13:35:49 -0700 | |
commit | 006a2f37ddb133f61c6fa672652663204c2d2e54 (patch) | |
tree | ee5f0252eee105f2f7b4e80a0bf291724fe75c16 /src/bun.js/bindings/JSFFIFunction.cpp | |
parent | 65b543fba63c1c1ece5100d0b76644f2f115a906 (diff) | |
download | bun-006a2f37ddb133f61c6fa672652663204c2d2e54.tar.gz bun-006a2f37ddb133f61c6fa672652663204c2d2e54.tar.zst bun-006a2f37ddb133f61c6fa672652663204c2d2e54.zip |
[bun:ffi] Add `threadsafe` option to callbacks
Diffstat (limited to 'src/bun.js/bindings/JSFFIFunction.cpp')
-rw-r--r-- | src/bun.js/bindings/JSFFIFunction.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/bun.js/bindings/JSFFIFunction.cpp b/src/bun.js/bindings/JSFFIFunction.cpp index 66fdc701d..c0fc34fc0 100644 --- a/src/bun.js/bindings/JSFFIFunction.cpp +++ b/src/bun.js/bindings/JSFFIFunction.cpp @@ -151,6 +151,32 @@ FFI_Callback_call(FFICallbackFunctionWrapper& wrapper, size_t argCount, JSC::Enc return JSC::JSValue::encode(result); } +extern "C" void +FFI_Callback_threadsafe_call(FFICallbackFunctionWrapper& wrapper, size_t argCount, JSC::EncodedJSValue* args) +{ + + auto* globalObject = wrapper.globalObject.get(); + WTF::Vector<JSC::EncodedJSValue, 8> argsVec; + for (size_t i = 0; i < argCount; ++i) + argsVec.append(args[i]); + + WebCore::ScriptExecutionContext::postTaskTo(globalObject->scriptExecutionContext()->identifier(), [argsVec = WTFMove(argsVec), wrapper](WebCore::ScriptExecutionContext& ctx) mutable { + auto* globalObject = JSC::jsCast<Zig::GlobalObject*>(ctx.jsGlobalObject()); + auto& vm = globalObject->vm(); + JSC::MarkedArgumentBuffer arguments; + auto* function = wrapper.m_function.get(); + for (size_t i = 0; i < argsVec.size(); ++i) + arguments.appendWithCrashOnOverflow(JSC::JSValue::decode(argsVec[i])); + WTF::NakedPtr<JSC::Exception> exception; + JSC::call(globalObject, function, JSC::getCallData(function), JSC::jsUndefined(), arguments, exception); + if (UNLIKELY(exception)) { + auto scope = DECLARE_THROW_SCOPE(vm); + scope.throwException(globalObject, exception); + return; + } + }); +} + extern "C" JSC::EncodedJSValue FFI_Callback_call_0(FFICallbackFunctionWrapper& wrapper, size_t argCount, JSC::EncodedJSValue* args) { |