Skip to content

Commit 106c86a

Browse files
committed
dont make new InternedString in hot path
1 parent a68fa68 commit 106c86a

File tree

4 files changed

+20
-13
lines changed

4 files changed

+20
-13
lines changed

src/cargo/core/resolver/dep_cache.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use crate::core::{
2121
};
2222
use crate::sources::source::QueryKind;
2323
use crate::util::errors::CargoResult;
24-
use crate::util::interning::InternedString;
24+
use crate::util::interning::{InternedString, INTERNED_DEFAULT};
2525

2626
use anyhow::Context as _;
2727
use std::collections::{BTreeSet, HashMap, HashSet};
@@ -348,7 +348,7 @@ fn build_requirements<'a, 'b: 'a>(
348348

349349
let handle_default = |uses_default_features, reqs: &mut Requirements<'_>| {
350350
if uses_default_features && s.features().contains_key("default") {
351-
if let Err(e) = reqs.require_feature(InternedString::new("default")) {
351+
if let Err(e) = reqs.require_feature(INTERNED_DEFAULT) {
352352
return Err(e.into_activate_error(parent, s));
353353
}
354354
}

src/cargo/core/resolver/features.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ use crate::core::dependency::{ArtifactTarget, DepKind, Dependency};
4343
use crate::core::resolver::types::FeaturesSet;
4444
use crate::core::resolver::{Resolve, ResolveBehavior};
4545
use crate::core::{FeatureValue, PackageId, PackageIdSpec, PackageSet, Workspace};
46-
use crate::util::interning::InternedString;
46+
use crate::util::interning::{InternedString, INTERNED_DEFAULT};
4747
use crate::util::CargoResult;
4848
use anyhow::{bail, Context};
4949
use itertools::Itertools;
@@ -745,9 +745,8 @@ impl<'a, 'gctx> FeatureResolver<'a, 'gctx> {
745745
.iter()
746746
.map(|f| FeatureValue::new(*f))
747747
.collect();
748-
let default = InternedString::new("default");
749-
if dep.uses_default_features() && feature_map.contains_key(&default) {
750-
result.push(FeatureValue::Feature(default));
748+
if dep.uses_default_features() && feature_map.contains_key(&INTERNED_DEFAULT) {
749+
result.push(FeatureValue::Feature(INTERNED_DEFAULT));
751750
}
752751
result
753752
}
@@ -762,9 +761,8 @@ impl<'a, 'gctx> FeatureResolver<'a, 'gctx> {
762761
let feature_map = summary.features();
763762

764763
let mut result: Vec<FeatureValue> = cli_features.features.iter().cloned().collect();
765-
let default = InternedString::new("default");
766-
if cli_features.uses_default_features && feature_map.contains_key(&default) {
767-
result.push(FeatureValue::Feature(default));
764+
if cli_features.uses_default_features && feature_map.contains_key(&INTERNED_DEFAULT) {
765+
result.push(FeatureValue::Feature(INTERNED_DEFAULT));
768766
}
769767

770768
if cli_features.all_features {

src/cargo/ops/tree/graph.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::core::dependency::DepKind;
66
use crate::core::resolver::features::{CliFeatures, FeaturesFor, ResolvedFeatures};
77
use crate::core::resolver::Resolve;
88
use crate::core::{FeatureMap, FeatureValue, Package, PackageId, PackageIdSpec, Workspace};
9-
use crate::util::interning::InternedString;
9+
use crate::util::interning::{InternedString, INTERNED_DEFAULT};
1010
use crate::util::CargoResult;
1111
use std::collections::{HashMap, HashSet};
1212

@@ -415,7 +415,7 @@ fn add_pkg(
415415
if dep.uses_default_features() {
416416
add_feature(
417417
graph,
418-
InternedString::new("default"),
418+
INTERNED_DEFAULT,
419419
Some(from_index),
420420
dep_index,
421421
EdgeKind::Dep(dep.kind()),
@@ -505,7 +505,7 @@ fn add_cli_features(
505505
}
506506

507507
if cli_features.uses_default_features {
508-
to_add.insert(FeatureValue::Feature(InternedString::new("default")));
508+
to_add.insert(FeatureValue::Feature(INTERNED_DEFAULT));
509509
}
510510
to_add.extend(cli_features.features.iter().cloned());
511511

src/cargo/util/interning.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,18 @@ use std::str;
1313
use std::sync::Mutex;
1414
use std::sync::OnceLock;
1515

16+
pub static INTERNED_DEFAULT: InternedString = InternedString { inner: "default" };
17+
1618
fn interned_storage() -> std::sync::MutexGuard<'static, HashSet<&'static str>> {
1719
static STRING_CACHE: OnceLock<Mutex<HashSet<&'static str>>> = OnceLock::new();
18-
STRING_CACHE.get_or_init(Default::default).lock().unwrap()
20+
STRING_CACHE
21+
.get_or_init(|| {
22+
let mut out: HashSet<&'static str> = Default::default();
23+
out.insert(INTERNED_DEFAULT.as_str());
24+
Mutex::new(out)
25+
})
26+
.lock()
27+
.unwrap()
1928
}
2029

2130
#[derive(Clone, Copy)]

0 commit comments

Comments
 (0)