diff options
author | Leo Kettmeir <crowlkats@toaxl.com> | 2023-01-08 23:48:46 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-08 23:48:46 +0100 |
commit | c41d4ff90e09b63bd1894052352a5acba57b1704 (patch) | |
tree | 52be95551ed263c2f4831aaefc78bb6fdda6d89c /core/runtime.rs | |
parent | 2be1282be42369e558cc77f75b22488ce7a8215e (diff) |
feat(core): allow specifying name and dependencies of an Extension (#17301)
Diffstat (limited to 'core/runtime.rs')
-rw-r--r-- | core/runtime.rs | 61 |
1 files changed, 39 insertions, 22 deletions
diff --git a/core/runtime.rs b/core/runtime.rs index 4a1302b3f..baa7de1a1 100644 --- a/core/runtime.rs +++ b/core/runtime.rs @@ -728,10 +728,9 @@ impl JsRuntime { /// Initializes JS of provided Extensions in the given realm fn init_extension_js(&mut self, realm: &JsRealm) -> Result<(), Error> { // Take extensions to avoid double-borrow - let mut extensions: Vec<Extension> = - std::mem::take(&mut self.extensions_with_js); - for m in extensions.iter_mut() { - let js_files = m.init_js(); + let extensions = std::mem::take(&mut self.extensions_with_js); + for ext in &extensions { + let js_files = ext.init_js(); for (filename, source) in js_files { // TODO(@AaronO): use JsRuntime::execute_static() here to move src off heap realm.execute_script(self.v8_isolate(), filename, source)?; @@ -752,6 +751,12 @@ impl JsRuntime { exts.extend(extensions); exts.extend(extensions_with_js); + for (ext, previous_exts) in + exts.iter().enumerate().map(|(i, ext)| (ext, &exts[..i])) + { + ext.check_dependencies(previous_exts); + } + // Middleware let middleware: Vec<Box<OpMiddlewareFn>> = exts .iter_mut() @@ -2554,7 +2559,7 @@ 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() + let ext = Extension::builder("test_ext") .ops(vec![op_test::decl()]) .state(move |state| { state.put(TestState { @@ -2976,7 +2981,9 @@ pub mod tests { } run_in_task(|cx| { - let ext = Extension::builder().ops(vec![op_err::decl()]).build(); + let ext = Extension::builder("test_ext") + .ops(vec![op_err::decl()]) + .build(); let mut runtime = JsRuntime::new(RuntimeOptions { extensions: vec![ext], get_error_class_fn: Some(&get_error_class_name), @@ -3428,7 +3435,7 @@ main(); } run_in_task(|cx| { - let ext = Extension::builder() + let ext = Extension::builder("test_ext") .ops(vec![op_err_sync::decl(), op_err_async::decl()]) .build(); let mut runtime = JsRuntime::new(RuntimeOptions { @@ -3596,7 +3603,7 @@ assertEquals(1, notify_return_value); Ok(()) } - let extension = Extension::builder() + let extension = Extension::builder("test_ext") .ops(vec![op_async_borrow::decl()]) .state(|state| { state.put(InnerState(42)); @@ -3631,7 +3638,7 @@ assertEquals(1, notify_return_value); Ok(()) } - let extension = Extension::builder() + let extension = Extension::builder("test_ext") .ops(vec![op_sync_serialize_object_with_numbers_as_keys::decl()]) .build(); @@ -3673,7 +3680,7 @@ Deno.core.ops.op_sync_serialize_object_with_numbers_as_keys({ Ok(()) } - let extension = Extension::builder() + let extension = Extension::builder("test_ext") .ops(vec![op_async_serialize_object_with_numbers_as_keys::decl()]) .build(); @@ -3712,7 +3719,7 @@ Deno.core.ops.op_async_serialize_object_with_numbers_as_keys({ Ok(()) } - let extension = Extension::builder() + let extension = Extension::builder("test_ext") .ops(vec![op_async_sleep::decl()]) .build(); @@ -3792,7 +3799,7 @@ Deno.core.ops.op_async_serialize_object_with_numbers_as_keys({ Ok(()) } - let extension = Extension::builder() + let extension = Extension::builder("test_ext") .ops(vec![op_macrotask::decl(), op_next_tick::decl()]) .build(); @@ -3922,7 +3929,7 @@ Deno.core.ops.op_async_serialize_object_with_numbers_as_keys({ Ok(()) } - let extension = Extension::builder() + let extension = Extension::builder("test_ext") .ops(vec![op_promise_reject::decl()]) .build(); @@ -3982,7 +3989,7 @@ Deno.core.ops.op_async_serialize_object_with_numbers_as_keys({ Ok(()) } - let extension = Extension::builder() + let extension = Extension::builder("test_ext") .ops(vec![op_promise_reject::decl()]) .build(); @@ -4051,7 +4058,9 @@ Deno.core.ops.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().ops(vec![op_err::decl()]).build(); + let ext = Extension::builder("test_ext") + .ops(vec![op_err::decl()]) + .build(); let mut runtime = JsRuntime::new(RuntimeOptions { extensions: vec![ext], ..Default::default() @@ -4076,7 +4085,9 @@ Deno.core.ops.op_async_serialize_object_with_numbers_as_keys({ Ok(x1 + x2 + x3 + x4) } - let ext = Extension::builder().ops(vec![op_add_4::decl()]).build(); + let ext = Extension::builder("test_ext") + .ops(vec![op_add_4::decl()]) + .build(); let mut runtime = JsRuntime::new(RuntimeOptions { extensions: vec![ext], ..Default::default() @@ -4095,7 +4106,7 @@ Deno.core.ops.op_async_serialize_object_with_numbers_as_keys({ Ok(42) } - let ext = Extension::builder() + let ext = Extension::builder("test_ext") .ops(vec![op_foo::decl().disable()]) .build(); let mut runtime = JsRuntime::new(RuntimeOptions { @@ -4125,7 +4136,7 @@ Deno.core.ops.op_async_serialize_object_with_numbers_as_keys({ Ok(b) } - let ext = Extension::builder() + let ext = Extension::builder("test_ext") .ops(vec![op_sum_take::decl(), op_boomerang::decl()]) .build(); @@ -4193,7 +4204,7 @@ Deno.core.ops.op_async_serialize_object_with_numbers_as_keys({ Ok(42) } - let ext = Extension::builder() + 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(); @@ -4245,7 +4256,9 @@ Deno.core.ops.op_async_serialize_object_with_numbers_as_keys({ } let mut runtime = JsRuntime::new(RuntimeOptions { - extensions: vec![Extension::builder().ops(vec![op_test::decl()]).build()], + extensions: vec![Extension::builder("test_ext") + .ops(vec![op_test::decl()]) + .build()], ..Default::default() }); let realm = runtime.create_realm().unwrap(); @@ -4275,7 +4288,9 @@ Deno.core.ops.op_async_serialize_object_with_numbers_as_keys({ let mut runtime = JsRuntime::new(RuntimeOptions { startup_snapshot: Some(Snapshot::Boxed(snapshot)), - extensions: vec![Extension::builder().ops(vec![op_test::decl()]).build()], + extensions: vec![Extension::builder("test_ext") + .ops(vec![op_test::decl()]) + .build()], ..Default::default() }); let realm = runtime.create_realm().unwrap(); @@ -4304,7 +4319,9 @@ Deno.core.ops.op_async_serialize_object_with_numbers_as_keys({ } let mut runtime = JsRuntime::new(RuntimeOptions { - extensions: vec![Extension::builder().ops(vec![op_test::decl()]).build()], + extensions: vec![Extension::builder("test_ext") + .ops(vec![op_test::decl()]) + .build()], get_error_class_fn: Some(&|error| { crate::error::get_custom_error_class(error).unwrap() }), |