Skip to content

Commit

Permalink
refactor: clone-on-write when needed for InternedString (#14808)
Browse files Browse the repository at this point in the history
### What does this PR try to resolve?

Use `Cow` instead of duplicating the interning logic.

Closes #14674

### How should we test and review this PR?

### Additional information
  • Loading branch information
epage authored Nov 11, 2024
2 parents 3f5abe3 + 1328108 commit 2bdeb60
Showing 1 changed file with 8 additions and 3 deletions.
11 changes: 8 additions & 3 deletions src/cargo/util/interning.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use serde::{Serialize, Serializer};
use serde_untagged::UntaggedEnumVisitor;
use std::borrow::Borrow;
use std::borrow::Cow;
use std::cmp::Ordering;
use std::collections::HashSet;
use std::ffi::OsStr;
Expand Down Expand Up @@ -46,7 +47,7 @@ impl<'a> From<&'a String> for InternedString {

impl From<String> for InternedString {
fn from(item: String) -> Self {
InternedString::new(&item)
InternedString::from_cow(item.into())
}
}

Expand All @@ -72,9 +73,13 @@ impl Eq for InternedString {}

impl InternedString {
pub fn new(str: &str) -> InternedString {
InternedString::from_cow(str.into())
}

fn from_cow<'a>(str: Cow<'a, str>) -> InternedString {
let mut cache = interned_storage();
let s = cache.get(str).copied().unwrap_or_else(|| {
let s = str.to_string().leak();
let s = cache.get(str.as_ref()).copied().unwrap_or_else(|| {
let s = str.into_owned().leak();
cache.insert(s);
s
});
Expand Down

0 comments on commit 2bdeb60

Please sign in to comment.