diff --git a/bench_util/benches/utf8.rs b/bench_util/benches/utf8.rs index 2bbf439b67..7a9066d1e0 100644 --- a/bench_util/benches/utf8.rs +++ b/bench_util/benches/utf8.rs @@ -6,12 +6,13 @@ use deno_bench_util::bencher::benchmark_group; use deno_bench_util::bencher::Bencher; use deno_bench_util::BenchOptions; use deno_core::Extension; +use deno_core::ExtensionFileSource; fn setup() -> Vec { vec![Extension::builder("bench_setup") - .js(vec![( - "setup.js", - r#" + .js(vec![ExtensionFileSource { + specifier: "setup.js".to_string(), + code: r#" const hello = "hello world\n"; const hello1k = hello.repeat(1e3); const hello1m = hello.repeat(1e6); @@ -19,7 +20,7 @@ fn setup() -> Vec { const hello1kEncoded = Deno.core.encode(hello1k); const hello1mEncoded = Deno.core.encode(hello1m); "#, - )]) + }]) .build()] } diff --git a/core/extensions.rs b/core/extensions.rs index ba7bdb18ab..e08e8c5667 100644 --- a/core/extensions.rs +++ b/core/extensions.rs @@ -6,7 +6,10 @@ use std::rc::Rc; use std::task::Context; use v8::fast_api::FastFunction; -pub type SourcePair = (String, &'static str); +pub struct ExtensionFileSource { + pub specifier: String, + pub code: &'static str, +} pub type OpFnRef = v8::FunctionCallback; pub type OpMiddlewareFn = dyn Fn(OpDecl) -> OpDecl; pub type OpStateFn = dyn Fn(&mut OpState) -> Result<(), Error>; @@ -37,8 +40,8 @@ impl OpDecl { #[derive(Default)] pub struct Extension { - js_files: Option>, - esm_files: Option>, + js_files: Option>, + esm_files: Option>, ops: Option>, opstate_fn: Option>, middleware_fn: Option>, @@ -82,14 +85,14 @@ impl Extension { /// returns JS source code to be loaded into the isolate (either at snapshotting, /// or at startup). as a vector of a tuple of the file name, and the source code. - pub fn get_js_sources(&self) -> &[SourcePair] { + pub fn get_js_sources(&self) -> &[ExtensionFileSource] { match &self.js_files { Some(files) => files, None => &[], } } - pub fn get_esm_sources(&self) -> &[SourcePair] { + pub fn get_esm_sources(&self) -> &[ExtensionFileSource] { match &self.esm_files { Some(files) => files, None => &[], @@ -152,8 +155,8 @@ impl Extension { // Provides a convenient builder pattern to declare Extensions #[derive(Default)] pub struct ExtensionBuilder { - js: Vec, - esm: Vec, + js: Vec, + esm: Vec, ops: Vec, state: Option>, middleware: Option>, @@ -168,26 +171,27 @@ impl ExtensionBuilder { self } - pub fn js( - &mut self, - js_files: Vec<(&'static str, &'static str)>, - ) -> &mut Self { - let js_files = js_files.into_iter().map(|source_pair| { - let name = format!("internal:{}/{}", self.name, source_pair.0); - (name, source_pair.1) - }); + pub fn js(&mut self, js_files: Vec) -> &mut Self { + let js_files = + js_files.into_iter().map(|file_source| ExtensionFileSource { + specifier: format!("internal:{}/{}", self.name, file_source.specifier), + code: file_source.code, + }); self.js.extend(js_files); self } - pub fn esm( - &mut self, - esm_files: Vec<(&'static str, &'static str)>, - ) -> &mut Self { - let esm_files = esm_files.into_iter().map(|source_pair| { - let name = format!("internal:{}/{}", self.name, source_pair.0); - (name, source_pair.1) - }); + pub fn esm(&mut self, esm_files: Vec) -> &mut Self { + let esm_files = + esm_files + .into_iter() + .map(|file_source| ExtensionFileSource { + specifier: format!( + "internal:{}/{}", + self.name, file_source.specifier + ), + code: file_source.code, + }); self.esm.extend(esm_files); self } @@ -254,10 +258,10 @@ impl ExtensionBuilder { macro_rules! include_js_files { ($($file:literal,)+) => { vec![ - $(( - $file, - include_str!($file), - ),)+ + $($crate::ExtensionFileSource { + specifier: $file.to_string(), + code: include_str!($file), + },)+ ] }; } diff --git a/core/lib.rs b/core/lib.rs index 868d6b7493..86c432d43d 100644 --- a/core/lib.rs +++ b/core/lib.rs @@ -54,6 +54,7 @@ pub use crate::async_cell::RcLike; pub use crate::async_cell::RcRef; pub use crate::extensions::Extension; pub use crate::extensions::ExtensionBuilder; +pub use crate::extensions::ExtensionFileSource; pub use crate::extensions::OpDecl; pub use crate::extensions::OpMiddlewareFn; pub use crate::flags::v8_set_flags; diff --git a/core/runtime.rs b/core/runtime.rs index 096d26ca3a..d4a9c697c8 100644 --- a/core/runtime.rs +++ b/core/runtime.rs @@ -815,27 +815,33 @@ impl JsRuntime { for ext in &extensions { { let js_files = ext.get_esm_sources(); - for (filename, source) in js_files { + for file_source in js_files { futures::executor::block_on(async { let id = self .load_side_module( - &ModuleSpecifier::parse(filename)?, - Some(source.to_string()), + &ModuleSpecifier::parse(&file_source.specifier)?, + Some(file_source.code.to_string()), ) .await?; let receiver = self.mod_evaluate(id); self.run_event_loop(false).await?; receiver.await? }) - .with_context(|| format!("Couldn't execute '{filename}'"))?; + .with_context(|| { + format!("Couldn't execute '{}'", file_source.specifier) + })?; } } { let js_files = ext.get_js_sources(); - for (filename, source) in js_files { + for file_source in js_files { // TODO(@AaronO): use JsRuntime::execute_static() here to move src off heap - realm.execute_script(self.v8_isolate(), filename, source)?; + realm.execute_script( + self.v8_isolate(), + &file_source.specifier, + file_source.code, + )?; } } } diff --git a/ext/url/benches/url_ops.rs b/ext/url/benches/url_ops.rs index fd8cac7ef0..001b5de926 100644 --- a/ext/url/benches/url_ops.rs +++ b/ext/url/benches/url_ops.rs @@ -6,18 +6,19 @@ use deno_bench_util::bencher::benchmark_group; use deno_bench_util::bencher::Bencher; use deno_core::Extension; +use deno_core::ExtensionFileSource; fn setup() -> Vec { vec![ deno_webidl::init(), deno_url::init(), Extension::builder("bench_setup") - .esm(vec![( - "internal:setup", - r#"import { URL } from "internal:deno_url/00_url.js"; + .esm(vec![ExtensionFileSource { + specifier: "internal:setup".to_string(), + code: r#"import { URL } from "internal:deno_url/00_url.js"; globalThis.URL = URL; "#, - )]) + }]) .build(), ] } diff --git a/ext/web/benches/encoding.rs b/ext/web/benches/encoding.rs index a96da1bc63..bb297a1bfe 100644 --- a/ext/web/benches/encoding.rs +++ b/ext/web/benches/encoding.rs @@ -5,6 +5,7 @@ use deno_bench_util::bench_or_profile; use deno_bench_util::bencher::benchmark_group; use deno_bench_util::bencher::Bencher; use deno_core::Extension; +use deno_core::ExtensionFileSource; use deno_web::BlobStore; struct Permissions; @@ -29,14 +30,14 @@ fn setup() -> Vec { deno_console::init(), deno_web::init::(BlobStore::default(), None), Extension::builder("bench_setup") - .esm(vec![( - "internal:setup", - r#" + .esm(vec![ExtensionFileSource { + specifier: "internal:setup".to_string(), + code: r#" import { TextDecoder } from "internal:deno_web/08_text_encoding.js"; globalThis.TextDecoder = TextDecoder; globalThis.hello12k = Deno.core.encode("hello world\n".repeat(1e3)); "#, - )]) + }]) .state(|state| { state.put(Permissions {}); Ok(()) diff --git a/ext/web/benches/timers_ops.rs b/ext/web/benches/timers_ops.rs index 943c73bbc0..f01b4c5323 100644 --- a/ext/web/benches/timers_ops.rs +++ b/ext/web/benches/timers_ops.rs @@ -5,6 +5,7 @@ use deno_bench_util::bench_or_profile; use deno_bench_util::bencher::benchmark_group; use deno_bench_util::bencher::Bencher; use deno_core::Extension; +use deno_core::ExtensionFileSource; use deno_web::BlobStore; struct Permissions; @@ -29,11 +30,14 @@ fn setup() -> Vec { deno_web::init::(BlobStore::default(), None), Extension::builder("bench_setup") .esm(vec![ - ("internal:setup", r#" + ExtensionFileSource { + specifier: "internal:setup".to_string(), + code: r#" import { setTimeout, handleTimerMacrotask } from "internal:deno_web/02_timers.js"; globalThis.setTimeout = setTimeout; Deno.core.setMacrotaskCallback(handleTimerMacrotask); - "#), + "# + }, ]) .state(|state| { state.put(Permissions{}); diff --git a/ext/webidl/benches/dict.rs b/ext/webidl/benches/dict.rs index 1400a00ed5..00bef49350 100644 --- a/ext/webidl/benches/dict.rs +++ b/ext/webidl/benches/dict.rs @@ -6,12 +6,16 @@ use deno_bench_util::bencher::benchmark_group; use deno_bench_util::bencher::Bencher; use deno_core::Extension; +use deno_core::ExtensionFileSource; fn setup() -> Vec { vec![ deno_webidl::init(), Extension::builder("deno_webidl_bench") - .esm(vec![("internal:setup", include_str!("dict.js"))]) + .esm(vec![ExtensionFileSource { + specifier: "internal:setup".to_string(), + code: include_str!("dict.js"), + }]) .build(), ] }