summaryrefslogtreecommitdiff
path: root/cli
diff options
context:
space:
mode:
authorMatt Mastracci <matthew@mastracci.com>2023-04-04 06:46:31 -0600
committerGitHub <noreply@github.com>2023-04-04 06:46:31 -0600
commita1764f7690cfdc3e42724fcad29ef954b7e576a4 (patch)
tree1b621ebd7a6ef50687eeb2061740895096136e8a /cli
parent2dc20168371e827b86e2ce0d1d7787139fba68f3 (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.rs2
-rw-r--r--cli/lsp/tsc.rs4
-rw-r--r--cli/module_loader.rs22
-rw-r--r--cli/standalone.rs35
-rw-r--r--cli/tools/coverage/mod.rs4
-rw-r--r--cli/tsc/mod.rs12
-rw-r--r--cli/util/text_encoding.rs4
-rw-r--r--cli/worker.rs5
8 files changed, 46 insertions, 42 deletions
diff --git a/cli/js.rs b/cli/js.rs
index fac771fd5..e3a5b94be 100644
--- a/cli/js.rs
+++ b/cli/js.rs
@@ -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 {