summaryrefslogtreecommitdiff
path: root/cli/emit.rs
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2024-04-14 17:15:17 -0400
committerGitHub <noreply@github.com>2024-04-14 17:15:17 -0400
commite277490c821d20280137ca54eede8502caf62bbd (patch)
treeb2653e570bca449167b968ae8d4f9331553b5f52 /cli/emit.rs
parent76df7d7c9bb7b6b552fd33efbedb28e21969d46c (diff)
perf: do not clone swc `Program` when transpiling (#23365)
Diffstat (limited to 'cli/emit.rs')
-rw-r--r--cli/emit.rs24
1 files changed, 17 insertions, 7 deletions
diff --git a/cli/emit.rs b/cli/emit.rs
index 0c79b11ee..07343f39d 100644
--- a/cli/emit.rs
+++ b/cli/emit.rs
@@ -93,14 +93,24 @@ impl Emitter {
{
Ok(emit_code.into())
} else {
- // this will use a cached version if it exists
- let parsed_source = self.parsed_source_cache.get_or_parse_module(
+ // nothing else needs the parsed source at this point, so remove from
+ // the cache in order to not transpile owned
+ let parsed_source = self.parsed_source_cache.remove_or_parse_module(
specifier,
source.clone(),
media_type,
)?;
- let transpiled_source =
- parsed_source.transpile(&self.transpile_options, &self.emit_options)?;
+ let transpiled_source = match parsed_source
+ .transpile_owned(&self.transpile_options, &self.emit_options)
+ {
+ Ok(result) => result?,
+ Err(parsed_source) => {
+ // transpile_owned is more efficient and should be preferred
+ debug_assert!(false, "Transpile owned failed.");
+ parsed_source
+ .transpile(&self.transpile_options, &self.emit_options)?
+ }
+ };
debug_assert!(transpiled_source.source_map.is_none());
self.emit_cache.set_emit_code(
specifier,
@@ -124,11 +134,11 @@ impl Emitter {
let source_arc: Arc<str> = source_code.into();
let parsed_source = self
.parsed_source_cache
- .get_or_parse_module(specifier, source_arc, media_type)?;
+ .remove_or_parse_module(specifier, source_arc, media_type)?;
let mut options = self.emit_options;
options.source_map = SourceMapOption::None;
- let transpiled_source =
- parsed_source.transpile(&self.transpile_options, &options)?;
+ let transpiled_source = parsed_source
+ .transpile_owned_with_fallback(&self.transpile_options, &options)?;
Ok(transpiled_source.text)
}