From 269b13930edd0220630f595239b94d96efdc20f4 Mon Sep 17 00:00:00 2001 From: Cong-Cong Date: Thu, 22 Aug 2024 08:44:52 +0800 Subject: [PATCH] perf: source map --- Cargo.lock | 3 +- Cargo.toml | 2 +- crates/rspack_binding_values/src/source.rs | 50 ++++++++++++++-------- 3 files changed, 33 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a1f2ccaa9ae4..34906f3fefb2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4139,8 +4139,7 @@ dependencies = [ [[package]] name = "rspack_sources" version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d93c575915e8b72d075cd7fc8e72fa3d0805683a775b63915cab4c412ed04aa" +source = "git+https://github.com/SyMind/rspack-sources.git?rev=24b9cd3#24b9cd3d61a59fe994bca0bacd576a7336aa8f0d" dependencies = [ "arrayvec", "dashmap 5.5.3", diff --git a/Cargo.toml b/Cargo.toml index 8dcb22902340..2f266c45c91b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -47,7 +47,7 @@ proc-macro2 = { version = "1.0.79" } quote = { version = "1.0.35" } rayon = { version = "1.10.0" } regex = { version = "1.10.4" } -rspack_sources = { version = "=0.2.17" } +rspack_sources = { git = "https://github.com/SyMind/rspack-sources.git", rev = "24b9cd3" } rustc-hash = { version = "1.1.0" } schemars = { version = "0.8.16" } serde = { version = "1.0.197" } diff --git a/crates/rspack_binding_values/src/source.rs b/crates/rspack_binding_values/src/source.rs index 460abfd10388..ccd67a0b49dc 100644 --- a/crates/rspack_binding_values/src/source.rs +++ b/crates/rspack_binding_values/src/source.rs @@ -23,8 +23,9 @@ pub struct JsCompatSource { pub struct CompatSource { pub is_raw: bool, pub is_buffer: bool, - pub source: Vec, - pub map: Option>, + pub buffer: Vec, + pub value_as_string: String, + pub map: Option, } impl FromNapiValue for CompatSource { @@ -38,7 +39,7 @@ impl std::hash::Hash for CompatSource { "__CompatSource".hash(state); self.is_raw.hash(state); self.is_buffer.hash(state); - self.source.hash(state); + self.buffer.hash(state); self.map.hash(state); } } @@ -47,57 +48,68 @@ impl PartialEq for CompatSource { fn eq(&self, other: &Self) -> bool { self.is_raw == other.is_raw && self.is_buffer == other.is_buffer - && self.source == other.source + && self.buffer == other.buffer && self.map == other.map } } impl From for CompatSource { fn from(source: JsCompatSource) -> Self { + let buffer = source.source.to_vec(); + let map = source + .map + .as_ref() + .and_then(|m| SourceMap::from_slice(m).ok()); + let value_as_string = String::from_utf8_lossy(&buffer).to_string(); Self { is_raw: source.is_raw, is_buffer: source.is_buffer, - source: source.source.into(), - map: source.map.map(Into::into), + buffer, + value_as_string, + map, } } } -impl StreamChunks for CompatSource { +impl<'a> StreamChunks<'a> for CompatSource { fn stream_chunks( - &self, + &'a self, options: &MapOptions, on_chunk: OnChunk, - on_source: OnSource, - on_name: OnName, + on_source: OnSource<'_, 'a>, + on_name: OnName<'_, 'a>, ) -> GeneratedInfo { - stream_chunks_default(self, options, on_chunk, on_source, on_name) + stream_chunks_default( + &self.value_as_string, + self.map.as_ref(), + options, + on_chunk, + on_source, + on_name, + ) } } impl Source for CompatSource { fn source(&self) -> Cow { // Use UTF-8 lossy for any sources, including `RawSource` as a workaround for not supporting either `Buffer` or `String` in `Source`. - String::from_utf8_lossy(&self.source) + Cow::Borrowed(&self.value_as_string) } fn buffer(&self) -> Cow<[u8]> { - Cow::Borrowed(self.source.as_ref()) + Cow::Borrowed(&self.buffer) } fn size(&self) -> usize { - self.source.len() + self.buffer.len() } fn map(&self, _options: &MapOptions) -> Option { - self - .map - .as_ref() - .and_then(|m| SourceMap::from_slice(m).ok()) + self.map.clone() } fn to_writer(&self, writer: &mut dyn std::io::Write) -> std::io::Result<()> { - writer.write_all(&self.source) + writer.write_all(&self.buffer) } }