diff options
author | Matt Mastracci <matthew@mastracci.com> | 2023-04-04 06:46:31 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-04 06:46:31 -0600 |
commit | a1764f7690cfdc3e42724fcad29ef954b7e576a4 (patch) | |
tree | 1b621ebd7a6ef50687eeb2061740895096136e8a /cli | |
parent | 2dc20168371e827b86e2ce0d1d7787139fba68f3 (diff) |
refactor(core): Improve ergonomics of managing ASCII strings (#18498)
This is a follow-on to the earlier work in reducing string copies,
mainly focused on ensuring that ASCII strings are easy to provide to the
JS runtime.
While we are replacing a 16-byte reference in a number of places with a
24-byte structure (measured via `std::mem::size_of`), the reduction in
copies wins out over the additional size of the arguments passed into
functions.
Benchmarking shows approximately the same if not slightly less wallclock
time/instructions retired, but I believe this continues to open up
further refactoring opportunities.
Diffstat (limited to 'cli')
-rw-r--r-- | cli/js.rs | 2 | ||||
-rw-r--r-- | cli/lsp/tsc.rs | 4 | ||||
-rw-r--r-- | cli/module_loader.rs | 22 | ||||
-rw-r--r-- | cli/standalone.rs | 35 | ||||
-rw-r--r-- | cli/tools/coverage/mod.rs | 4 | ||||
-rw-r--r-- | cli/tsc/mod.rs | 12 | ||||
-rw-r--r-- | cli/util/text_encoding.rs | 4 | ||||
-rw-r--r-- | cli/worker.rs | 5 |
8 files changed, 46 insertions, 42 deletions
@@ -22,7 +22,7 @@ mod tests { ..Default::default() }); js_runtime - .execute_script( + .execute_script_static( "<anon>", r#" if (!(bootstrap.mainRuntime && bootstrap.workerRuntime)) { diff --git a/cli/lsp/tsc.rs b/cli/lsp/tsc.rs index ef5d0e645..e236eee0a 100644 --- a/cli/lsp/tsc.rs +++ b/cli/lsp/tsc.rs @@ -2899,7 +2899,7 @@ fn start(runtime: &mut JsRuntime, debug: bool) -> Result<(), AnyError> { let init_config = json!({ "debug": debug }); let init_src = format!("globalThis.serverInit({init_config});"); - runtime.execute_script(located_script_name!(), init_src)?; + runtime.execute_script(located_script_name!(), init_src.into())?; Ok(()) } @@ -3493,7 +3493,7 @@ pub fn request( }; let mark = performance.mark("request", Some(request_params.clone())); let request_src = format!("globalThis.serverRequest({request_params});"); - runtime.execute_script(located_script_name!(), request_src)?; + runtime.execute_script(located_script_name!(), request_src.into())?; let op_state = runtime.op_state(); let mut op_state = op_state.borrow_mut(); diff --git a/cli/module_loader.rs b/cli/module_loader.rs index 7f6101d80..b7df15e31 100644 --- a/cli/module_loader.rs +++ b/cli/module_loader.rs @@ -78,7 +78,7 @@ impl CliModuleLoader { fn load_prepared_module( &self, specifier: &ModuleSpecifier, - maybe_referrer: Option<ModuleSpecifier>, + maybe_referrer: Option<&ModuleSpecifier>, ) -> Result<ModuleCodeSource, AnyError> { if specifier.scheme() == "node" { unreachable!(); // Node built-in modules should be handled internally. @@ -92,7 +92,7 @@ impl CliModuleLoader { specifier, .. })) => Ok(ModuleCodeSource { - code: source.into(), + code: source.clone().into(), found_url: specifier.clone(), media_type: *media_type, }), @@ -107,7 +107,7 @@ impl CliModuleLoader { | MediaType::Unknown | MediaType::Cjs | MediaType::Mjs - | MediaType::Json => source.into(), + | MediaType::Json => source.clone().into(), MediaType::Dts | MediaType::Dcts | MediaType::Dmts => { Default::default() } @@ -154,7 +154,7 @@ impl CliModuleLoader { fn load_sync( &self, specifier: &ModuleSpecifier, - maybe_referrer: Option<ModuleSpecifier>, + maybe_referrer: Option<&ModuleSpecifier>, is_dynamic: bool, ) -> Result<ModuleSource, AnyError> { let code_source = if self.ps.npm_resolver.in_npm_package(specifier) { @@ -210,15 +210,15 @@ impl CliModuleLoader { // because we don't need it code_without_source_map(code_source.code) }; - Ok(ModuleSource { - code, - module_url_specified: specifier.to_string(), - module_url_found: code_source.found_url.to_string(), - module_type: match code_source.media_type { + Ok(ModuleSource::new_with_redirect( + match code_source.media_type { MediaType::Json => ModuleType::Json, _ => ModuleType::JavaScript, }, - }) + code, + specifier, + &code_source.found_url, + )) } } @@ -240,7 +240,7 @@ impl ModuleLoader for CliModuleLoader { fn load( &self, specifier: &ModuleSpecifier, - maybe_referrer: Option<ModuleSpecifier>, + maybe_referrer: Option<&ModuleSpecifier>, is_dynamic: bool, ) -> Pin<Box<deno_core::ModuleSourceFuture>> { // NOTE: this block is async only because of `deno_core` interface diff --git a/cli/standalone.rs b/cli/standalone.rs index 527e8d975..08caacda6 100644 --- a/cli/standalone.rs +++ b/cli/standalone.rs @@ -25,6 +25,7 @@ use deno_core::url::Url; use deno_core::v8_set_flags; use deno_core::ModuleLoader; use deno_core::ModuleSpecifier; +use deno_core::ModuleType; use deno_core::ResolutionKind; use deno_graph::source::Resolver; use deno_runtime::fmt_errors::format_js_error; @@ -165,7 +166,7 @@ impl ModuleLoader for EmbeddedModuleLoader { fn load( &self, module_specifier: &ModuleSpecifier, - _maybe_referrer: Option<ModuleSpecifier>, + _maybe_referrer: Option<&ModuleSpecifier>, _is_dynamic: bool, ) -> Pin<Box<deno_core::ModuleSourceFuture>> { let is_data_uri = get_source_from_data_url(module_specifier).ok(); @@ -173,33 +174,33 @@ impl ModuleLoader for EmbeddedModuleLoader { .eszip .get_module(module_specifier.as_str()) .ok_or_else(|| type_error("Module not found")); - + // TODO(mmastrac): This clone can probably be removed in the future if ModuleSpecifier is no longer a full-fledged URL let module_specifier = module_specifier.clone(); + async move { if let Some((source, _)) = is_data_uri { - return Ok(deno_core::ModuleSource { - code: source.into(), - module_type: deno_core::ModuleType::JavaScript, - module_url_specified: module_specifier.to_string(), - module_url_found: module_specifier.to_string(), - }); + return Ok(deno_core::ModuleSource::new( + deno_core::ModuleType::JavaScript, + source.into(), + &module_specifier, + )); } let module = module?; let code = module.source().await; let code = std::str::from_utf8(&code) .map_err(|_| type_error("Module source is not utf-8"))? - .to_owned(); + .to_owned() + .into(); - Ok(deno_core::ModuleSource { - code: code.into(), - module_type: match module.kind { - eszip::ModuleKind::JavaScript => deno_core::ModuleType::JavaScript, - eszip::ModuleKind::Json => deno_core::ModuleType::Json, + Ok(deno_core::ModuleSource::new( + match module.kind { + eszip::ModuleKind::JavaScript => ModuleType::JavaScript, + eszip::ModuleKind::Json => ModuleType::Json, }, - module_url_specified: module_specifier.to_string(), - module_url_found: module_specifier.to_string(), - }) + code, + &module_specifier, + )) } .boxed_local() } diff --git a/cli/tools/coverage/mod.rs b/cli/tools/coverage/mod.rs index 2346b3614..7f2598811 100644 --- a/cli/tools/coverage/mod.rs +++ b/cli/tools/coverage/mod.rs @@ -691,7 +691,7 @@ pub async fn cover_files( | MediaType::Unknown | MediaType::Cjs | MediaType::Mjs - | MediaType::Json => file.source.into(), + | MediaType::Json => file.source.clone().into(), MediaType::Dts | MediaType::Dmts | MediaType::Dcts => Default::default(), MediaType::TypeScript | MediaType::Jsx @@ -718,7 +718,7 @@ pub async fn cover_files( let source_map = source_map_from_code(&transpiled_code); let coverage_report = generate_coverage_report( &script_coverage, - transpiled_code.take_as_string(), + transpiled_code.as_str().to_owned(), &source_map, &out_mode, ); diff --git a/cli/tsc/mod.rs b/cli/tsc/mod.rs index a9dc5b7f3..3bd8efefa 100644 --- a/cli/tsc/mod.rs +++ b/cli/tsc/mod.rs @@ -13,6 +13,7 @@ use crate::util::path::mapped_specifier_for_tsc; use deno_ast::MediaType; use deno_core::anyhow::anyhow; use deno_core::anyhow::Context; +use deno_core::ascii_str; use deno_core::error::AnyError; use deno_core::located_script_name; use deno_core::op; @@ -131,8 +132,8 @@ fn get_asset_texts_from_new_runtime() -> Result<Vec<AssetText>, AnyError> { extensions: vec![deno_cli_tsc::init_ops()], ..Default::default() }); - let global = - runtime.execute_script("get_assets.js", "globalThis.getAssets()")?; + let global = runtime + .execute_script("get_assets.js", ascii_str!("globalThis.getAssets()"))?; let scope = &mut runtime.handle_scope(); let local = deno_core::v8::Local::new(scope, global); Ok(serde_v8::from_v8::<Vec<AssetText>>(scope, local)?) @@ -792,15 +793,14 @@ pub fn exec(request: Request) -> Result<Response, AnyError> { }, ); - let startup_source = "globalThis.startup({ legacyFlag: false })"; + let startup_source = ascii_str!("globalThis.startup({ legacyFlag: false })"); let request_value = json!({ "config": request.config, "debug": request.debug, "rootNames": root_names, "localOnly": request.check_mode == TypeCheckMode::Local, }); - let request_str = request_value.to_string(); - let exec_source = format!("globalThis.exec({request_str})"); + let exec_source = format!("globalThis.exec({request_value})").into(); let mut runtime = JsRuntime::new(RuntimeOptions { startup_snapshot: Some(compiler_snapshot()), @@ -974,7 +974,7 @@ mod tests { ..Default::default() }); js_runtime - .execute_script( + .execute_script_static( "<anon>", r#" if (!(startup)) { diff --git a/cli/util/text_encoding.rs b/cli/util/text_encoding.rs index 0111ec82f..29a8d4069 100644 --- a/cli/util/text_encoding.rs +++ b/cli/util/text_encoding.rs @@ -160,7 +160,9 @@ mod tests { fn run_test(input: &'static str, output: &'static str) { assert_eq!( - code_without_source_map(input.into()).take_as_string(), + code_without_source_map(ModuleCode::from_static(input)) + .as_str() + .to_owned(), output ); } diff --git a/cli/worker.rs b/cli/worker.rs index 5beef84ff..edd604519 100644 --- a/cli/worker.rs +++ b/cli/worker.rs @@ -5,6 +5,7 @@ use std::rc::Rc; use std::sync::Arc; use deno_ast::ModuleSpecifier; +use deno_core::ascii_str; use deno_core::error::AnyError; use deno_core::futures::task::LocalFutureObj; use deno_core::futures::FutureExt; @@ -184,7 +185,7 @@ impl CliMainWorker { // Enable op call tracing in core to enable better debugging of op sanitizer // failures. if self.ps.options.trace_ops() { - self.worker.js_runtime.execute_script( + self.worker.js_runtime.execute_script_static( located_script_name!(), "Deno[Deno.internal].core.enableOpCallTracing();", )?; @@ -231,7 +232,7 @@ impl CliMainWorker { self.worker.execute_script( located_script_name!(), - "Deno[Deno.internal].core.enableOpCallTracing();", + ascii_str!("Deno[Deno.internal].core.enableOpCallTracing();"), )?; if mode != TestMode::Documentation { |