Skip to content

Commit 55b7568

Browse files
committed
perf: has_named_replacements
1 parent ed51f33 commit 55b7568

3 files changed

Lines changed: 48 additions & 37 deletions

File tree

src/concat_source.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ impl Stream for ConcatSourceStream<'_> {
293293
let mut current_line_offset = 0;
294294
let mut current_column_offset = 0;
295295
let mut source_mapping: HashMap<Cow<str>, u32> = HashMap::default();
296-
let mut name_mapping: HashMap<Cow<str>, u32> = HashMap::default();
296+
let mut name_mapping: HashMap<&str, u32> = HashMap::default();
297297
let mut need_to_close_mapping = false;
298298

299299
let source_index_mapping: RefCell<LinearMap<u32>> =
@@ -411,7 +411,7 @@ impl Stream for ConcatSourceStream<'_> {
411411
let mut global_index = name_mapping.get(&name).copied();
412412
if global_index.is_none() {
413413
let len = name_mapping.len() as u32;
414-
name_mapping.insert(name.clone(), len);
414+
name_mapping.insert(name, len);
415415
on_name(len, name);
416416
global_index = Some(len);
417417
}

src/helpers.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ pub type OnSource<'a, 'b> =
118118
&'a mut dyn FnMut(u32, Cow<'b, str>, Option<&'b Arc<str>>);
119119

120120
/// [OnName] abstraction, see [webpack-sources onName](https://github.com/webpack/webpack-sources/blob/9f98066311d53a153fdc7c633422a1d086528027/lib/helpers/streamChunks.js#L13).
121-
pub type OnName<'a, 'b> = &'a mut dyn FnMut(u32, Cow<'b, str>);
121+
pub type OnName<'a, 'b> = &'a mut dyn FnMut(u32, &'b str);
122122

123123
/// Callback invoked for each section during [`Stream::sections`], receiving the
124124
/// section's [`SectionOffset`] and an optional [`SourceMap`].
@@ -436,7 +436,7 @@ fn stream_chunks_of_source_map_final<'a>(
436436
)
437437
}
438438
for (i, name) in source_map.names().iter().enumerate() {
439-
on_name(i as u32, Cow::Borrowed(name));
439+
on_name(i as u32, name);
440440
}
441441
let mut mapping_active_line = 0;
442442
let mut on_mapping = |mapping: Mapping| {
@@ -499,7 +499,7 @@ fn stream_chunks_of_source_map_full<'a>(
499499
)
500500
}
501501
for (i, name) in source_map.names().iter().enumerate() {
502-
on_name(i as u32, Cow::Borrowed(name));
502+
on_name(i as u32, name);
503503
}
504504
let last_line = &lines[lines.len() - 1].line;
505505
let last_new_line = last_line.ends_with('\n');
@@ -780,12 +780,12 @@ pub fn stream_chunks_of_combined_source_map<'a>(
780780
let inner_source: RefCell<Option<&Arc<str>>> = RefCell::new(inner_source);
781781
let source_mapping: RefCell<HashMap<Cow<str>, u32>> =
782782
RefCell::new(HashMap::default());
783-
let mut name_mapping: HashMap<Cow<str>, u32> = HashMap::default();
783+
let mut name_mapping: HashMap<&str, u32> = HashMap::default();
784784
let source_index_mapping: RefCell<LinearMap<i64>> =
785785
RefCell::new(LinearMap::default());
786786
let name_index_mapping: RefCell<LinearMap<i64>> =
787787
RefCell::new(LinearMap::default());
788-
let name_index_value_mapping: RefCell<LinearMap<Cow<str>>> =
788+
let name_index_value_mapping: RefCell<LinearMap<&str>> =
789789
RefCell::new(LinearMap::default());
790790
let inner_source_index: RefCell<i64> = RefCell::new(-2);
791791
let inner_source_index_mapping: RefCell<LinearMap<i64>> =
@@ -799,7 +799,7 @@ pub fn stream_chunks_of_combined_source_map<'a>(
799799
> = RefCell::new(LinearMap::default());
800800
let inner_name_index_mapping: RefCell<LinearMap<i64>> =
801801
RefCell::new(LinearMap::default());
802-
let inner_name_index_value_mapping: RefCell<LinearMap<Cow<str>>> =
802+
let inner_name_index_value_mapping: RefCell<LinearMap<&str>> =
803803
RefCell::new(LinearMap::default());
804804
let inner_source_map_line_data: RefCell<Vec<SourceMapLineData>> =
805805
RefCell::new(Vec::new());
@@ -962,8 +962,8 @@ pub fn stream_chunks_of_combined_source_map<'a>(
962962
let mut global_index = name_mapping.get(name).copied();
963963
if global_index.is_none() {
964964
let len = name_mapping.len() as u32;
965-
name_mapping.insert(name.clone(), len);
966-
on_name(len, name.clone());
965+
name_mapping.insert(name, len);
966+
on_name(len, name);
967967
global_index = Some(len);
968968
}
969969
final_name_index = global_index.unwrap() as i64;
@@ -1019,8 +1019,8 @@ pub fn stream_chunks_of_combined_source_map<'a>(
10191019
let mut global_index = name_mapping.get(name).copied();
10201020
if global_index.is_none() {
10211021
let len = name_mapping.len() as u32;
1022-
name_mapping.insert(name.clone(), len);
1023-
on_name(len, name.clone());
1022+
name_mapping.insert(name, len);
1023+
on_name(len, name);
10241024
global_index = Some(len);
10251025
}
10261026
final_name_index = global_index.unwrap() as i64;
@@ -1119,8 +1119,8 @@ pub fn stream_chunks_of_combined_source_map<'a>(
11191119
let mut global_index = name_mapping.get(name).copied();
11201120
if global_index.is_none() {
11211121
let len = name_mapping.len() as u32;
1122-
name_mapping.borrow_mut().insert(name.clone(), len);
1123-
on_name(len, name.clone());
1122+
name_mapping.borrow_mut().insert(name, len);
1123+
on_name(len, name);
11241124
global_index = Some(len);
11251125
}
11261126
final_name_index = global_index.unwrap() as i64;

src/replace_source.rs

Lines changed: 34 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -431,17 +431,20 @@ impl Stream for ReplaceSourceStream<'_> {
431431
on_name: crate::helpers::OnName<'_, 'a>,
432432
) -> crate::helpers::GeneratedInfo {
433433
let on_name = RefCell::new(on_name);
434-
let repls = &self.replacements;
434+
let replacements = &self.replacements;
435435
let mut pos: u32 = 0;
436436
let mut i: usize = 0;
437437
let mut replacement_end: Option<u32> = None;
438-
let mut next_replacement = (i < repls.len()).then(|| repls[i].start);
438+
let mut next_replacement = (i < replacements.len()).then(|| replacements[i].start);
439439
let mut generated_line_offset: i64 = 0;
440440
let mut generated_column_offset: i64 = 0;
441441
let mut generated_column_offset_line = 0;
442442
let source_content_lines: RefCell<LinearMap<Option<SourceContent>>> =
443443
RefCell::new(LinearMap::default());
444-
let name_mapping: RefCell<HashMap<Cow<str>, u32>> =
444+
445+
// if has named replacements, we need to map the name to the global name index
446+
let has_named_replacements = replacements.iter().any(|repl| repl.name.is_some());
447+
let name_mapping: RefCell<HashMap<&str, u32>> =
445448
RefCell::new(HashMap::default());
446449
let name_index_mapping: RefCell<LinearMap<u32>> =
447450
RefCell::new(LinearMap::default());
@@ -585,9 +588,13 @@ impl Stream for ReplaceSourceStream<'_> {
585588
source_index: original.source_index,
586589
original_line: original.original_line,
587590
original_column: original.original_column,
588-
name_index: original.name_index.and_then(|name_index| {
589-
name_index_mapping.borrow().get(&name_index).copied()
590-
}),
591+
name_index: if !has_named_replacements {
592+
original.name_index
593+
} else {
594+
original.name_index.and_then(|name_index| {
595+
name_index_mapping.borrow().get(&name_index).copied()
596+
})
597+
},
591598
}
592599
}),
593600
},
@@ -612,7 +619,7 @@ impl Stream for ReplaceSourceStream<'_> {
612619
// Insert replacement content split into chunks by lines
613620
#[allow(unsafe_code)]
614621
// SAFETY: The safety of this operation relies on the fact that the `ReplaceSource` type will not delete the `replacements` during its entire lifetime.
615-
let repl = &repls[i];
622+
let repl = &replacements[i];
616623

617624
let lines =
618625
split_into_lines(repl.content.as_str()).collect::<Vec<_>>();
@@ -627,8 +634,8 @@ impl Stream for ReplaceSourceStream<'_> {
627634
let mut global_index = name_mapping.get(name.as_str()).copied();
628635
if global_index.is_none() {
629636
let len = name_mapping.len() as u32;
630-
name_mapping.insert(Cow::Borrowed(name), len);
631-
on_name.borrow_mut()(len, Cow::Borrowed(name));
637+
name_mapping.insert(name, len);
638+
on_name.borrow_mut()(len, name);
632639
global_index = Some(len);
633640
}
634641
replacement_name_index = global_index;
@@ -683,8 +690,8 @@ impl Stream for ReplaceSourceStream<'_> {
683690

684691
// Move to next replacement
685692
i += 1;
686-
next_replacement = if i < repls.len() {
687-
Some(repls[i].start)
693+
next_replacement = if i < replacements.len() {
694+
Some(replacements[i].start)
688695
} else {
689696
None
690697
};
@@ -792,24 +799,28 @@ impl Stream for ReplaceSourceStream<'_> {
792799
on_source(source_index, source, source_content);
793800
},
794801
&mut |name_index, name| {
795-
let mut name_mapping = name_mapping.borrow_mut();
796-
let mut global_index = name_mapping.get(&name).copied();
797-
if global_index.is_none() {
798-
let len = name_mapping.len() as u32;
799-
name_mapping.insert(name.clone(), len);
800-
on_name.borrow_mut()(len, name);
801-
global_index = Some(len);
802+
if !has_named_replacements {
803+
on_name.borrow_mut()(name_index, name);
804+
} else {
805+
let mut name_mapping = name_mapping.borrow_mut();
806+
let mut global_index = name_mapping.get(&name).copied();
807+
if global_index.is_none() {
808+
let len = name_mapping.len() as u32;
809+
name_mapping.insert(name, len);
810+
on_name.borrow_mut()(len, name);
811+
global_index = Some(len);
812+
}
813+
name_index_mapping
814+
.borrow_mut()
815+
.insert(name_index, global_index.unwrap());
802816
}
803-
name_index_mapping
804-
.borrow_mut()
805-
.insert(name_index, global_index.unwrap());
806817
},
807818
);
808819

809820
// Handle remaining replacements one by one
810821
let mut line = result.generated_line as i64 + generated_line_offset;
811-
while i < repls.len() {
812-
let content = &repls[i].content;
822+
while i < replacements.len() {
823+
let content = &replacements[i].content;
813824
let lines: Vec<&str> = split_into_lines(content).collect();
814825

815826
for (line_idx, content_line) in lines.iter().enumerate() {

0 commit comments

Comments
 (0)