summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
Diffstat (limited to 'ext')
-rw-r--r--ext/ffi/lib.rs14
1 files changed, 13 insertions, 1 deletions
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<NativeType>,
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<bool>,
+ #[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<NativeValue> =
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, &parameter_types, result_type)
});