summaryrefslogtreecommitdiff
path: root/core/runtime.rs
diff options
context:
space:
mode:
authorLeo Kettmeir <crowlkats@toaxl.com>2023-01-08 23:48:46 +0100
committerGitHub <noreply@github.com>2023-01-08 23:48:46 +0100
commitc41d4ff90e09b63bd1894052352a5acba57b1704 (patch)
tree52be95551ed263c2f4831aaefc78bb6fdda6d89c /core/runtime.rs
parent2be1282be42369e558cc77f75b22488ce7a8215e (diff)
feat(core): allow specifying name and dependencies of an Extension (#17301)
Diffstat (limited to 'core/runtime.rs')
-rw-r--r--core/runtime.rs61
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()
}),