summaryrefslogtreecommitdiff
path: root/core/runtime.rs
diff options
context:
space:
mode:
authorMatt Mastracci <matthew@mastracci.com>2023-03-17 12:22:15 -0600
committerGitHub <noreply@github.com>2023-03-17 18:22:15 +0000
commite55b448730160a6e4df9815a268d4049ac89deab (patch)
tree35d80fd60f2f1d1d06903caff256484a7d703d76 /core/runtime.rs
parent0bc6bf5d33b8198253954d7f04558270de45c925 (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.rs166
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()
});