From 132c761e87679aec52b9ed8324ee2a4b00705620 Mon Sep 17 00:00:00 2001 From: Divy Srivastava Date: Sat, 9 Jul 2022 18:41:07 +0530 Subject: fix(ext/ffi): allow opting out of fast ffi calls (#15131) --- ext/ffi/lib.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'ext') diff --git a/ext/ffi/lib.rs b/ext/ffi/lib.rs index d998c8138..a5a156727 100644 --- a/ext/ffi/lib.rs +++ b/ext/ffi/lib.rs @@ -72,6 +72,7 @@ struct Symbol { ptr: libffi::middle::CodePtr, parameter_types: Vec, result_type: NativeType, + can_callback: bool, } #[allow(clippy::non_send_fields_in_send_ty)] @@ -433,6 +434,13 @@ struct ForeignFunction { result: NativeType, #[serde(rename = "nonblocking")] non_blocking: Option, + #[serde(rename = "callback")] + #[serde(default = "default_callback")] + callback: bool, +} + +fn default_callback() -> bool { + false } // ForeignStatic's name and type fields are read and used by @@ -599,6 +607,7 @@ where ptr, parameter_types: foreign_fn.parameters, result_type: foreign_fn.result, + can_callback: foreign_fn.callback, }); resource.symbols.insert(symbol_key, sym.clone()); @@ -689,7 +698,8 @@ fn make_sync_fn<'s>( ) -> v8::Local<'s, v8::Function> { let mut fast_ffi_templ = None; - if !sym.parameter_types.iter().any(|t| !is_fast_api(*t)) + if !sym.can_callback + && !sym.parameter_types.iter().any(|t| !is_fast_api(*t)) && is_fast_api(sym.result_type) { let mut args = sym @@ -941,6 +951,7 @@ where result_type, cif, ptr: fun_ptr, + .. } = symbol; let mut ffi_args: Vec = Vec::with_capacity(parameter_types.len()); @@ -1814,6 +1825,7 @@ fn op_ffi_call_nonblocking<'scope>( ptr, parameter_types, result_type, + .. } = symbol.clone(); ffi_call(call_args, &cif, ptr, ¶meter_types, result_type) }); -- cgit v1.2.3