Skip to content

Commit b39b9fa

Browse files
committed
perf: name_for_condition for Arc<str>
1 parent 6b73fc7 commit b39b9fa

File tree

13 files changed

+80
-43
lines changed

13 files changed

+80
-43
lines changed

crates/rspack_core/src/compilation/make/graph_updater/repair/factorize.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ pub struct FactorizeTask {
2323
pub original_module_identifier: Option<ModuleIdentifier>,
2424
pub original_module_source: Option<BoxSource>,
2525
pub original_module_context: Option<Box<Context>>,
26-
pub issuer: Option<Box<str>>,
26+
pub issuer: Option<Arc<str>>,
2727
pub issuer_layer: Option<ModuleLayer>,
2828
pub dependencies: Vec<BoxDependency>,
2929
pub resolve_options: Option<Arc<Resolve>>,

crates/rspack_core/src/compilation/make/graph_updater/repair/process_dependencies.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ impl Task<TaskContext> for ProcessDependenciesTask {
101101
original_module_source,
102102
issuer: module
103103
.as_normal_module()
104-
.and_then(|module| module.name_for_condition()),
104+
.and_then(|module| module.name_for_condition().cloned()),
105105
issuer_layer: module.get_layer().cloned(),
106106
dependencies,
107107
resolve_options: module.get_resolve_options(),

crates/rspack_core/src/compilation/make/module_executor/execute.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
use std::{collections::VecDeque, iter::once, sync::atomic::AtomicU32};
1+
use std::{
2+
collections::VecDeque,
3+
iter::once,
4+
sync::{Arc, atomic::AtomicU32},
5+
};
26

37
use itertools::Itertools;
48
use rspack_collections::{DatabaseItem, Identifier, IdentifierSet, UkeySet};
@@ -19,7 +23,7 @@ use crate::{
1923
pub struct ExecutedRuntimeModule {
2024
pub identifier: Identifier,
2125
pub name: String,
22-
pub name_for_condition: Option<String>,
26+
pub name_for_condition: Option<Arc<str>>,
2327
pub module_type: ModuleType,
2428
pub size: f64,
2529
pub cacheable: bool,
@@ -382,7 +386,7 @@ impl Task<ExecutorTaskContext> for ExecuteTask {
382386
ExecutedRuntimeModule {
383387
identifier,
384388
name: runtime_module.name().to_string(),
385-
name_for_condition: runtime_module.name_for_condition().map(|n| n.to_string()),
389+
name_for_condition: runtime_module.name_for_condition().cloned(),
386390
module_type: *runtime_module.module_type(),
387391
cacheable: !(runtime_module.full_hash() || runtime_module.dependent_hash()),
388392
size: runtime_module_size

crates/rspack_core/src/concatenated_module.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ pub struct ConcatenatedModuleHooks {
7171
pub struct RootModuleContext {
7272
pub id: ModuleIdentifier,
7373
pub readable_identifier: String,
74-
pub name_for_condition: Option<Box<str>>,
74+
pub name_for_condition: Option<Arc<str>>,
7575
pub lib_indent: Option<String>,
7676
pub resolve_options: Option<Arc<Resolve>>,
7777
pub code_generation_dependencies: Option<Vec<BoxModuleDependency>>,
@@ -1600,8 +1600,8 @@ impl Module for ConcatenatedModule {
16001600
Ok(hasher.digest(&compilation.options.output.hash_digest))
16011601
}
16021602

1603-
fn name_for_condition(&self) -> Option<Box<str>> {
1604-
self.root_module_ctxt.name_for_condition.clone()
1603+
fn name_for_condition(&self) -> Option<&Arc<str>> {
1604+
self.root_module_ctxt.name_for_condition.as_ref()
16051605
}
16061606

16071607
fn lib_ident(&self, _options: LibIdentOptions) -> Option<Cow<'_, str>> {

crates/rspack_core/src/module.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ pub trait Module:
314314
) -> Result<CodeGenerationResult>;
315315

316316
/// Name matched against bundle-splitting conditions.
317-
fn name_for_condition(&self) -> Option<Box<str>> {
317+
fn name_for_condition(&self) -> Option<&Arc<str>> {
318318
// Align with https://github.com/webpack/webpack/blob/8241da7f1e75c5581ba535d127fa66aeb9eb2ac8/lib/Module.js#L852
319319
None
320320
}

crates/rspack_core/src/module_factory.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ pub struct ModuleFactoryCreateData {
1717
pub request: String,
1818
pub context: Context,
1919
pub dependencies: Vec<BoxDependency>,
20-
pub issuer: Option<Box<str>>,
20+
pub issuer: Option<Arc<str>>,
2121
pub issuer_identifier: Option<ModuleIdentifier>,
2222
pub issuer_layer: Option<ModuleLayer>,
2323
pub resolver_factory: Arc<ResolverFactory>,

crates/rspack_core/src/normal_module.rs

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,8 @@ pub struct NormalModule {
148148
build_info: BuildInfo,
149149
build_meta: BuildMeta,
150150
parsed: bool,
151+
152+
name_for_condition: Arc<str>,
151153
}
152154

153155
static DEBUG_ID: AtomicUsize = AtomicUsize::new(1);
@@ -185,6 +187,16 @@ impl NormalModule {
185187
) -> Self {
186188
let module_type = module_type.into();
187189
let id = Self::create_id(&module_type, layer.as_ref(), &request);
190+
191+
// Align with https://github.com/webpack/webpack/blob/8241da7f1e75c5581ba535d127fa66aeb9eb2ac8/lib/NormalModule.js#L375
192+
let resource = resource_data.resource();
193+
let idx = resource.find('?');
194+
let name_for_condition = if let Some(idx) = idx {
195+
Arc::from(resource[..idx].to_string())
196+
} else {
197+
Arc::from(resource.to_string())
198+
};
199+
188200
Self {
189201
blocks: Vec::new(),
190202
dependencies: Vec::new(),
@@ -214,6 +226,8 @@ impl NormalModule {
214226
build_meta: Default::default(),
215227
parsed: false,
216228
source_map_kind: SourceMapKind::empty(),
229+
230+
name_for_condition,
217231
}
218232
}
219233

@@ -668,15 +682,8 @@ impl Module for NormalModule {
668682
Ok(hasher.digest(&compilation.options.output.hash_digest))
669683
}
670684

671-
fn name_for_condition(&self) -> Option<Box<str>> {
672-
// Align with https://github.com/webpack/webpack/blob/8241da7f1e75c5581ba535d127fa66aeb9eb2ac8/lib/NormalModule.js#L375
673-
let resource = self.resource_data.resource();
674-
let idx = resource.find('?');
675-
if let Some(idx) = idx {
676-
Some(resource[..idx].into())
677-
} else {
678-
Some(resource.into())
679-
}
685+
fn name_for_condition(&self) -> Option<&Arc<str>> {
686+
Some(&self.name_for_condition)
680687
}
681688

682689
fn lib_ident(&self, options: LibIdentOptions) -> Option<Cow<'_, str>> {

crates/rspack_core/src/options/module.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -972,7 +972,7 @@ pub struct FuncUseCtx {
972972
pub real_resource: Option<String>,
973973
pub resource_query: Option<String>,
974974
pub resource_fragment: Option<String>,
975-
pub issuer: Option<Box<str>>,
975+
pub issuer: Option<Arc<str>>,
976976
pub issuer_layer: Option<String>,
977977
}
978978

crates/rspack_plugin_css_chunking/src/lib.rs

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
use std::{
22
collections::HashSet,
3-
sync::atomic::{AtomicBool, Ordering},
3+
sync::{
4+
Arc,
5+
atomic::{AtomicBool, Ordering},
6+
},
47
};
58

69
use rspack_collections::{
@@ -19,7 +22,7 @@ use rspack_regex::RspackRegex;
1922
const MIN_CSS_CHUNK_SIZE: f64 = 30_f64 * 1024_f64;
2023
const MAX_CSS_CHUNK_SIZE: f64 = 100_f64 * 1024_f64;
2124

22-
fn is_global_css(name_for_condition: &Option<Box<str>>) -> bool {
25+
fn is_global_css(name_for_condition: Option<&str>) -> bool {
2326
name_for_condition.as_ref().is_some_and(|s| {
2427
!s.ends_with(".module.css") && !s.ends_with(".module.scss") && !s.ends_with(".module.sass")
2528
})
@@ -145,7 +148,7 @@ async fn optimize_chunks(&self, compilation: &mut Compilation) -> Result<Option<
145148
chunk_states.insert(*chunk_ukey, chunk_state);
146149
}
147150

148-
let module_infos: IdentifierMap<(f64, Option<Box<str>>)> = {
151+
let module_infos: IdentifierMap<(f64, Option<Arc<str>>)> = {
149152
let module_graph = compilation.get_module_graph();
150153
let mut result = IdentifierMap::default();
151154
for module_identifier in chunk_states_by_module.keys() {
@@ -154,7 +157,10 @@ async fn optimize_chunks(&self, compilation: &mut Compilation) -> Result<Option<
154157
.module_by_identifier(module_identifier)
155158
.unwrap();
156159
let size = module.size(None, None);
157-
result.insert(*module_identifier, (size, module.name_for_condition()));
160+
result.insert(
161+
*module_identifier,
162+
(size, module.name_for_condition().cloned()),
163+
);
158164
}
159165
result
160166
};
@@ -221,7 +227,13 @@ async fn optimize_chunks(&self, compilation: &mut Compilation) -> Result<Option<
221227
remaining_modules.shift_remove(&start_module_identifier);
222228

223229
#[allow(clippy::unwrap_used)]
224-
let mut global_css_mode = is_global_css(&module_infos.get(&start_module_identifier).unwrap().1);
230+
let mut global_css_mode = is_global_css(
231+
module_infos
232+
.get(&start_module_identifier)
233+
.unwrap()
234+
.1
235+
.as_deref(),
236+
);
225237

226238
// The current position of processing in all selected chunks
227239
#[allow(clippy::unwrap_used)]
@@ -324,7 +336,13 @@ async fn optimize_chunks(&self, compilation: &mut Compilation) -> Result<Option<
324336

325337
// Global CSS must not leak into unrelated chunks
326338
#[allow(clippy::unwrap_used)]
327-
let is_global = is_global_css(&module_infos.get(&next_module_identifier).unwrap().1);
339+
let is_global = is_global_css(
340+
module_infos
341+
.get(&next_module_identifier)
342+
.unwrap()
343+
.1
344+
.as_deref(),
345+
);
328346
if is_global && global_css_mode && all_chunk_states.len() != next_chunk_states.len() {
329347
// Fast check: chunk groups need to be identical
330348
continue;

crates/rspack_plugin_extract_css/src/css_module.rs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::hash::Hash;
1+
use std::{hash::Hash, sync::Arc};
22

33
use rspack_cacheable::{cacheable, cacheable_dyn};
44
use rspack_collections::{Identifiable, Identifier};
@@ -40,6 +40,8 @@ pub(crate) struct CssModule {
4040
dependencies: Vec<DependencyId>,
4141

4242
identifier__: Identifier,
43+
44+
name_for_condition: Option<Arc<str>>,
4345
}
4446

4547
impl CssModule {
@@ -56,6 +58,12 @@ impl CssModule {
5658
)
5759
.into();
5860

61+
let name_for_condition: Option<Arc<str>> = dep
62+
.identifier
63+
.split('!')
64+
.next_back()
65+
.map(|resource| resource.split('?').next().unwrap_or(resource).into());
66+
5967
Self {
6068
identifier: dep.identifier,
6169
content: dep.content,
@@ -81,6 +89,7 @@ impl CssModule {
8189
build_meta: Default::default(),
8290
source_map_kind: rspack_util::source_map::SourceMapKind::empty(),
8391
identifier__,
92+
name_for_condition,
8493
}
8594
}
8695

@@ -138,12 +147,8 @@ impl Module for CssModule {
138147
))
139148
}
140149

141-
fn name_for_condition(&self) -> Option<Box<str>> {
142-
self
143-
.identifier
144-
.split('!')
145-
.next_back()
146-
.map(|resource| resource.split('?').next().unwrap_or(resource).into())
150+
fn name_for_condition(&self) -> Option<&Arc<str>> {
151+
self.name_for_condition.as_ref()
147152
}
148153

149154
fn size(&self, _source_type: Option<&SourceType>, _compilation: Option<&Compilation>) -> f64 {

0 commit comments

Comments
 (0)