diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2024-04-14 17:15:17 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-14 17:15:17 -0400 |
commit | e277490c821d20280137ca54eede8502caf62bbd (patch) | |
tree | b2653e570bca449167b968ae8d4f9331553b5f52 /cli/emit.rs | |
parent | 76df7d7c9bb7b6b552fd33efbedb28e21969d46c (diff) |
perf: do not clone swc `Program` when transpiling (#23365)
Diffstat (limited to 'cli/emit.rs')
-rw-r--r-- | cli/emit.rs | 24 |
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) } |