aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/bindings/JSFFIFunction.cpp
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-11-02 13:30:40 -0700
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-11-02 13:35:49 -0700
commit006a2f37ddb133f61c6fa672652663204c2d2e54 (patch)
treeee5f0252eee105f2f7b4e80a0bf291724fe75c16 /src/bun.js/bindings/JSFFIFunction.cpp
parent65b543fba63c1c1ece5100d0b76644f2f115a906 (diff)
downloadbun-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.cpp26
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)
{