summaryrefslogtreecommitdiff
path: root/core/ops_builtin_v8.rs
diff options
context:
space:
mode:
Diffstat (limited to 'core/ops_builtin_v8.rs')
-rw-r--r--core/ops_builtin_v8.rs34
1 files changed, 18 insertions, 16 deletions
diff --git a/core/ops_builtin_v8.rs b/core/ops_builtin_v8.rs
index 5ca62c811..978134ee2 100644
--- a/core/ops_builtin_v8.rs
+++ b/core/ops_builtin_v8.rs
@@ -595,25 +595,27 @@ fn op_get_promise_details<'a>(
#[op(v8)]
fn op_set_promise_hooks(
scope: &mut v8::HandleScope,
- init_cb: serde_v8::Value,
- before_cb: serde_v8::Value,
- after_cb: serde_v8::Value,
- resolve_cb: serde_v8::Value,
+ init_hook: serde_v8::Value,
+ before_hook: serde_v8::Value,
+ after_hook: serde_v8::Value,
+ resolve_hook: serde_v8::Value,
) -> Result<(), Error> {
- let init_hook_global = to_v8_fn(scope, init_cb)?;
- let before_hook_global = to_v8_fn(scope, before_cb)?;
- let after_hook_global = to_v8_fn(scope, after_cb)?;
- let resolve_hook_global = to_v8_fn(scope, resolve_cb)?;
- let init_hook = v8::Local::new(scope, init_hook_global);
- let before_hook = v8::Local::new(scope, before_hook_global);
- let after_hook = v8::Local::new(scope, after_hook_global);
- let resolve_hook = v8::Local::new(scope, resolve_hook_global);
+ let v8_fns = [init_hook, before_hook, after_hook, resolve_hook]
+ .into_iter()
+ .enumerate()
+ .filter(|(_, hook)| !hook.v8_value.is_undefined())
+ .try_fold([None; 4], |mut v8_fns, (i, hook)| {
+ let v8_fn = v8::Local::<v8::Function>::try_from(hook.v8_value)
+ .map_err(|err| type_error(err.to_string()))?;
+ v8_fns[i] = Some(v8_fn);
+ Ok::<_, Error>(v8_fns)
+ })?;
scope.get_current_context().set_promise_hooks(
- Some(init_hook),
- Some(before_hook),
- Some(after_hook),
- Some(resolve_hook),
+ v8_fns[0], // init
+ v8_fns[1], // before
+ v8_fns[2], // after
+ v8_fns[3], // resolve
);
Ok(())