diff options
Diffstat (limited to 'core/bindings.rs')
-rw-r--r-- | core/bindings.rs | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/core/bindings.rs b/core/bindings.rs index ae138bfbf..3745abf69 100644 --- a/core/bindings.rs +++ b/core/bindings.rs @@ -25,6 +25,9 @@ lazy_static! { function: send.map_fn_to() }, v8::ExternalReference { + function: set_macrotask_callback.map_fn_to() + }, + v8::ExternalReference { function: eval_context.map_fn_to() }, v8::ExternalReference { @@ -145,6 +148,19 @@ pub fn initialize_context<'s>( send_val.into(), ); + let mut set_macrotask_callback_tmpl = + v8::FunctionTemplate::new(scope, set_macrotask_callback); + let set_macrotask_callback_val = set_macrotask_callback_tmpl + .get_function(scope, context) + .unwrap(); + core_val.set( + context, + v8::String::new(scope, "setMacrotaskCallback") + .unwrap() + .into(), + set_macrotask_callback_val.into(), + ); + let mut eval_context_tmpl = v8::FunctionTemplate::new(scope, eval_context); let eval_context_val = eval_context_tmpl.get_function(scope, context).unwrap(); @@ -429,6 +445,27 @@ fn send( } } +fn set_macrotask_callback( + scope: v8::FunctionCallbackScope, + args: v8::FunctionCallbackArguments, + _rv: v8::ReturnValue, +) { + let deno_isolate: &mut Isolate = + unsafe { &mut *(scope.isolate().get_data(0) as *mut Isolate) }; + + if !deno_isolate.js_macrotask_cb.is_empty() { + let msg = + v8::String::new(scope, "Deno.core.setMacrotaskCallback already called.") + .unwrap(); + scope.isolate().throw_exception(msg.into()); + return; + } + + let macrotask_cb_fn = + v8::Local::<v8::Function>::try_from(args.get(0)).unwrap(); + deno_isolate.js_macrotask_cb.set(scope, macrotask_cb_fn); +} + fn eval_context( scope: v8::FunctionCallbackScope, args: v8::FunctionCallbackArguments, |