diff options
author | Matt Mastracci <matthew@mastracci.com> | 2023-03-17 12:22:15 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-17 18:22:15 +0000 |
commit | e55b448730160a6e4df9815a268d4049ac89deab (patch) | |
tree | 35d80fd60f2f1d1d06903caff256484a7d703d76 /core/runtime.rs | |
parent | 0bc6bf5d33b8198253954d7f04558270de45c925 (diff) |
feat(core) deno_core::extension! macro to simplify extension registration (#18210)
This implements two macros to simplify extension registration and centralize a lot of the boilerplate as a base for future improvements:
* `deno_core::ops!` registers a block of `#[op]`s, optionally with type
parameters, useful for places where we share lists of ops
* `deno_core::extension!` is used to register an extension, and creates
two methods that can be used at runtime/snapshot generation time:
`init_ops` and `init_ops_and_esm`.
---------
Co-authored-by: Bartek IwaĆczuk <biwanczuk@gmail.com>
Diffstat (limited to 'core/runtime.rs')
-rw-r--r-- | core/runtime.rs | 166 |
1 files changed, 72 insertions, 94 deletions
diff --git a/core/runtime.rs b/core/runtime.rs index c19765dd9..1ea9c0168 100644 --- a/core/runtime.rs +++ b/core/runtime.rs @@ -323,11 +323,11 @@ impl JsRuntime { if !has_startup_snapshot { options .extensions - .insert(0, crate::ops_builtin::init_builtin_ops_and_esm()); + .insert(0, crate::ops_builtin::core::init_ops_and_esm()); } else { options .extensions - .insert(0, crate::ops_builtin::init_builtin_ops()); + .insert(0, crate::ops_builtin::core::init_ops()); } let ops = Self::collect_ops(&mut options.extensions); @@ -2683,7 +2683,7 @@ pub mod tests { } #[derive(Copy, Clone)] - enum Mode { + pub enum Mode { Async, AsyncDeferred, AsyncZeroCopy(bool), @@ -2728,18 +2728,22 @@ pub mod tests { fn setup(mode: Mode) -> (JsRuntime, Arc<AtomicUsize>) { let dispatch_count = Arc::new(AtomicUsize::new(0)); - let dispatch_count2 = dispatch_count.clone(); - let ext = Extension::builder("test_ext") - .ops(vec![op_test::decl()]) - .state(move |state| { + deno_core::extension!( + test_ext, + ops = [op_test], + config = { + mode: Mode, + dispatch_count: Arc<AtomicUsize>, + }, + state = |state, mode, dispatch_count| { state.put(TestState { mode, - dispatch_count: dispatch_count2.clone(), - }); - }) - .build(); + dispatch_count + }) + } + ); let mut runtime = JsRuntime::new(RuntimeOptions { - extensions: vec![ext], + extensions: vec![test_ext::init_ops(mode, dispatch_count.clone())], get_error_class_fn: Some(&|error| { crate::error::get_custom_error_class(error).unwrap() }), @@ -3149,11 +3153,9 @@ pub mod tests { "DOMExceptionOperationError" } - let ext = Extension::builder("test_ext") - .ops(vec![op_err::decl()]) - .build(); + deno_core::extension!(test_ext, ops = [op_err]); let mut runtime = JsRuntime::new(RuntimeOptions { - extensions: vec![ext], + extensions: vec![test_ext::init_ops()], get_error_class_fn: Some(&get_error_class_name), ..Default::default() }); @@ -3720,11 +3722,9 @@ main(); Err(anyhow!("original async error").context("higher-level async error")) } - let ext = Extension::builder("test_ext") - .ops(vec![op_err_sync::decl(), op_err_async::decl()]) - .build(); + deno_core::extension!(test_ext, ops = [op_err_sync, op_err_async]); let mut runtime = JsRuntime::new(RuntimeOptions { - extensions: vec![ext], + extensions: vec![test_ext::init_ops()], ..Default::default() }); @@ -3889,15 +3889,13 @@ assertEquals(1, notify_return_value); Ok(()) } - let extension = Extension::builder("test_ext") - .ops(vec![op_async_borrow::decl()]) - .state(|state| { - state.put(InnerState(42)); - }) - .build(); - + deno_core::extension!( + test_ext, + ops = [op_async_borrow], + state = |state| state.put(InnerState(42)) + ); let mut runtime = JsRuntime::new(RuntimeOptions { - extensions: vec![extension], + extensions: vec![test_ext::init_ops()], ..Default::default() }); @@ -3923,12 +3921,12 @@ assertEquals(1, notify_return_value); Ok(()) } - let extension = Extension::builder("test_ext") - .ops(vec![op_sync_serialize_object_with_numbers_as_keys::decl()]) - .build(); - + deno_core::extension!( + test_ext, + ops = [op_sync_serialize_object_with_numbers_as_keys] + ); let mut runtime = JsRuntime::new(RuntimeOptions { - extensions: vec![extension], + extensions: vec![test_ext::init_ops()], ..Default::default() }); @@ -3965,12 +3963,12 @@ Deno.core.ops.op_sync_serialize_object_with_numbers_as_keys({ Ok(()) } - let extension = Extension::builder("test_ext") - .ops(vec![op_async_serialize_object_with_numbers_as_keys::decl()]) - .build(); - + deno_core::extension!( + test_ext, + ops = [op_async_serialize_object_with_numbers_as_keys] + ); let mut runtime = JsRuntime::new(RuntimeOptions { - extensions: vec![extension], + extensions: vec![test_ext::init_ops()], ..Default::default() }); @@ -4004,12 +4002,9 @@ Deno.core.opAsync("op_async_serialize_object_with_numbers_as_keys", { Ok(()) } - let extension = Extension::builder("test_ext") - .ops(vec![op_async_sleep::decl()]) - .build(); - + deno_core::extension!(test_ext, ops = [op_async_sleep]); let mut runtime = JsRuntime::new(RuntimeOptions { - extensions: vec![extension], + extensions: vec![test_ext::init_ops()], ..Default::default() }); @@ -4084,12 +4079,9 @@ Deno.core.opAsync("op_async_serialize_object_with_numbers_as_keys", { Ok(()) } - let extension = Extension::builder("test_ext") - .ops(vec![op_macrotask::decl(), op_next_tick::decl()]) - .build(); - + deno_core::extension!(test_ext, ops = [op_macrotask, op_next_tick]); let mut runtime = JsRuntime::new(RuntimeOptions { - extensions: vec![extension], + extensions: vec![test_ext::init_ops()], ..Default::default() }); @@ -4214,12 +4206,9 @@ Deno.core.opAsync("op_async_serialize_object_with_numbers_as_keys", { Ok(()) } - let extension = Extension::builder("test_ext") - .ops(vec![op_promise_reject::decl()]) - .build(); - + deno_core::extension!(test_ext, ops = [op_promise_reject]); let mut runtime = JsRuntime::new(RuntimeOptions { - extensions: vec![extension], + extensions: vec![test_ext::init_ops()], ..Default::default() }); @@ -4321,9 +4310,7 @@ Deno.core.opAsync("op_async_serialize_object_with_numbers_as_keys", { Ok(()) } - let extension = Extension::builder("test_ext") - .ops(vec![op_promise_reject::decl()]) - .build(); + deno_core::extension!(test_ext, ops = [op_promise_reject]); #[derive(Default)] struct ModsLoader; @@ -4367,7 +4354,7 @@ Deno.core.opAsync("op_async_serialize_object_with_numbers_as_keys", { } let mut runtime = JsRuntime::new(RuntimeOptions { - extensions: vec![extension], + extensions: vec![test_ext::init_ops()], module_loader: Some(Rc::new(ModsLoader)), ..Default::default() }); @@ -4390,11 +4377,9 @@ Deno.core.opAsync("op_async_serialize_object_with_numbers_as_keys", { Ok([(1, 2), (3, 4)].into_iter().collect()) // Maps can't have non-string keys in serde_v8 } - let ext = Extension::builder("test_ext") - .ops(vec![op_err::decl()]) - .build(); + deno_core::extension!(test_ext, ops = [op_err]); let mut runtime = JsRuntime::new(RuntimeOptions { - extensions: vec![ext], + extensions: vec![test_ext::init_ops()], ..Default::default() }); assert!(runtime @@ -4417,11 +4402,9 @@ Deno.core.opAsync("op_async_serialize_object_with_numbers_as_keys", { Ok(x1 + x2 + x3 + x4) } - let ext = Extension::builder("test_ext") - .ops(vec![op_add_4::decl()]) - .build(); + deno_core::extension!(test_ext, ops = [op_add_4]); let mut runtime = JsRuntime::new(RuntimeOptions { - extensions: vec![ext], + extensions: vec![test_ext::init_ops()], ..Default::default() }); let r = runtime @@ -4438,11 +4421,13 @@ Deno.core.opAsync("op_async_serialize_object_with_numbers_as_keys", { Ok(42) } - let ext = Extension::builder("test_ext") - .ops(vec![op_foo::decl().disable()]) - .build(); + fn ops() -> Vec<OpDecl> { + vec![op_foo::decl().disable()] + } + + deno_core::extension!(test_ext, ops_fn = ops); let mut runtime = JsRuntime::new(RuntimeOptions { - extensions: vec![ext], + extensions: vec![test_ext::init_ops()], ..Default::default() }); let r = runtime @@ -4468,12 +4453,9 @@ Deno.core.opAsync("op_async_serialize_object_with_numbers_as_keys", { Ok(b) } - let ext = Extension::builder("test_ext") - .ops(vec![op_sum_take::decl(), op_boomerang::decl()]) - .build(); - + deno_core::extension!(test_ext, ops = [op_sum_take, op_boomerang]); let mut runtime = JsRuntime::new(RuntimeOptions { - extensions: vec![ext], + extensions: vec![test_ext::init_ops()], ..Default::default() }); @@ -4536,12 +4518,13 @@ Deno.core.opAsync("op_async_serialize_object_with_numbers_as_keys", { Ok(42) } - let ext = Extension::builder("test_ext") - .ops(vec![op_foo::decl(), op_bar::decl()]) - .middleware(|op| if op.is_unstable { op.disable() } else { op }) - .build(); + deno_core::extension!( + test_ext, + ops = [op_foo, op_bar], + middleware = |op| if op.is_unstable { op.disable() } else { op } + ); let mut runtime = JsRuntime::new(RuntimeOptions { - extensions: vec![ext], + extensions: vec![test_ext::init_ops()], ..Default::default() }); runtime @@ -4587,10 +4570,9 @@ Deno.core.opAsync("op_async_serialize_object_with_numbers_as_keys", { Ok(String::from("Test")) } + deno_core::extension!(test_ext, ops = [op_test]); let mut runtime = JsRuntime::new(RuntimeOptions { - extensions: vec![Extension::builder("test_ext") - .ops(vec![op_test::decl()]) - .build()], + extensions: vec![test_ext::init_ops()], ..Default::default() }); let realm = runtime.create_realm().unwrap(); @@ -4618,11 +4600,10 @@ Deno.core.opAsync("op_async_serialize_object_with_numbers_as_keys", { Ok(String::from("Test")) } + deno_core::extension!(test_ext, ops = [op_test]); let mut runtime = JsRuntime::new(RuntimeOptions { startup_snapshot: Some(Snapshot::Boxed(snapshot)), - extensions: vec![Extension::builder("test_ext") - .ops(vec![op_test::decl()]) - .build()], + extensions: vec![test_ext::init_ops()], ..Default::default() }); let realm = runtime.create_realm().unwrap(); @@ -4650,10 +4631,9 @@ Deno.core.opAsync("op_async_serialize_object_with_numbers_as_keys", { } } + deno_core::extension!(test_ext, ops = [op_test]); let mut runtime = JsRuntime::new(RuntimeOptions { - extensions: vec![Extension::builder("test_ext") - .ops(vec![op_test::decl()]) - .build()], + extensions: vec![test_ext::init_ops()], get_error_class_fn: Some(&|error| { crate::error::get_custom_error_class(error).unwrap() }), @@ -4699,10 +4679,9 @@ Deno.core.opAsync("op_async_serialize_object_with_numbers_as_keys", { } } + deno_core::extension!(test_ext, ops = [op_test]); let mut runtime = JsRuntime::new(RuntimeOptions { - extensions: vec![Extension::builder("test_ext") - .ops(vec![op_test::decl()]) - .build()], + extensions: vec![test_ext::init_ops()], get_error_class_fn: Some(&|error| { crate::error::get_custom_error_class(error).unwrap() }), @@ -4759,10 +4738,9 @@ Deno.core.opAsync("op_async_serialize_object_with_numbers_as_keys", { futures::future::pending().await } + deno_core::extension!(test_ext, ops = [op_pending]); let mut runtime = JsRuntime::new(RuntimeOptions { - extensions: vec![Extension::builder("test_ext") - .ops(vec![op_pending::decl()]) - .build()], + extensions: vec![test_ext::init_ops()], ..Default::default() }); |