Skip to content

Commit c14bb6e

Browse files
committed
minimal-copy deserialize for InternedString and use InternedString more places
1 parent 69aea5b commit c14bb6e

File tree

11 files changed

+84
-35
lines changed

11 files changed

+84
-35
lines changed

crates/resolver-tests/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ pub fn resolve_with_config_raw(
171171
pkg_id("root"),
172172
deps,
173173
&BTreeMap::<String, Vec<String>>::new(),
174-
None::<String>,
174+
None::<&String>,
175175
false,
176176
)
177177
.unwrap();

crates/resolver-tests/tests/resolve.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use std::env;
2-
31
use cargo::core::dependency::Kind;
42
use cargo::core::{enable_nightly_features, Dependency};
53
use cargo::util::{is_ci, Config};

src/cargo/core/dependency.rs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ pub enum Kind {
101101
}
102102

103103
fn parse_req_with_deprecated(
104-
name: &str,
104+
name: InternedString,
105105
req: &str,
106106
extra: Option<(PackageId, &Config)>,
107107
) -> CargoResult<VersionReq> {
@@ -163,12 +163,13 @@ impl ser::Serialize for Kind {
163163
impl Dependency {
164164
/// Attempt to create a `Dependency` from an entry in the manifest.
165165
pub fn parse(
166-
name: &str,
166+
name: impl Into<InternedString>,
167167
version: Option<&str>,
168168
source_id: SourceId,
169169
inside: PackageId,
170170
config: &Config,
171171
) -> CargoResult<Dependency> {
172+
let name = name.into();
172173
let arg = Some((inside, config));
173174
let (specified_req, version_req) = match version {
174175
Some(v) => (true, parse_req_with_deprecated(name, v, arg)?),
@@ -187,10 +188,11 @@ impl Dependency {
187188

188189
/// Attempt to create a `Dependency` from an entry in the manifest.
189190
pub fn parse_no_deprecated(
190-
name: &str,
191+
name: impl Into<InternedString>,
191192
version: Option<&str>,
192193
source_id: SourceId,
193194
) -> CargoResult<Dependency> {
195+
let name = name.into();
194196
let (specified_req, version_req) = match version {
195197
Some(v) => (true, parse_req_with_deprecated(name, v, None)?),
196198
None => (false, VersionReq::any()),
@@ -206,11 +208,11 @@ impl Dependency {
206208
Ok(ret)
207209
}
208210

209-
pub fn new_override(name: &str, source_id: SourceId) -> Dependency {
211+
pub fn new_override(name: InternedString, source_id: SourceId) -> Dependency {
210212
assert!(!name.is_empty());
211213
Dependency {
212214
inner: Rc::new(Inner {
213-
name: InternedString::new(name),
215+
name,
214216
source_id,
215217
registry_id: None,
216218
req: VersionReq::any(),
@@ -338,12 +340,9 @@ impl Dependency {
338340
/// Sets the list of features requested for the package.
339341
pub fn set_features(
340342
&mut self,
341-
features: impl IntoIterator<Item = impl AsRef<str>>,
343+
features: impl IntoIterator<Item = impl Into<InternedString>>,
342344
) -> &mut Dependency {
343-
Rc::make_mut(&mut self.inner).features = features
344-
.into_iter()
345-
.map(|s| InternedString::new(s.as_ref()))
346-
.collect();
345+
Rc::make_mut(&mut self.inner).features = features.into_iter().map(|s| s.into()).collect();
347346
self
348347
}
349348

@@ -376,8 +375,11 @@ impl Dependency {
376375
self
377376
}
378377

379-
pub fn set_explicit_name_in_toml(&mut self, name: &str) -> &mut Dependency {
380-
Rc::make_mut(&mut self.inner).explicit_name_in_toml = Some(InternedString::new(name));
378+
pub fn set_explicit_name_in_toml(
379+
&mut self,
380+
name: impl Into<InternedString>,
381+
) -> &mut Dependency {
382+
Rc::make_mut(&mut self.inner).explicit_name_in_toml = Some(name.into());
381383
self
382384
}
383385

src/cargo/core/interning.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,18 @@ pub struct InternedString {
2323
inner: &'static str,
2424
}
2525

26+
impl<'a> From<&'a str> for InternedString {
27+
fn from(item: &'a str) -> Self {
28+
InternedString::new(item)
29+
}
30+
}
31+
32+
impl<'a> From<&'a String> for InternedString {
33+
fn from(item: &'a String) -> Self {
34+
InternedString::new(item)
35+
}
36+
}
37+
2638
impl PartialEq for InternedString {
2739
fn eq(&self, other: &InternedString) -> bool {
2840
ptr::eq(self.as_str(), other.as_str())
@@ -56,6 +68,12 @@ impl Deref for InternedString {
5668
}
5769
}
5870

71+
impl AsRef<str> for InternedString {
72+
fn as_ref(&self) -> &str {
73+
self.as_str()
74+
}
75+
}
76+
5977
impl Hash for InternedString {
6078
// N.B., we can't implement this as `identity(self).hash(state)`,
6179
// because we use this for on-disk fingerprints and so need
@@ -105,3 +123,29 @@ impl Serialize for InternedString {
105123
serializer.serialize_str(self.inner)
106124
}
107125
}
126+
127+
struct InternedStringVisitor;
128+
129+
impl<'de> serde::Deserialize<'de> for InternedString {
130+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
131+
where
132+
D: serde::Deserializer<'de>,
133+
{
134+
deserializer.deserialize_str(InternedStringVisitor)
135+
}
136+
}
137+
138+
impl<'de> serde::de::Visitor<'de> for InternedStringVisitor {
139+
type Value = InternedString;
140+
141+
fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
142+
formatter.write_str("an String like thing")
143+
}
144+
145+
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
146+
where
147+
E: serde::de::Error,
148+
{
149+
Ok(InternedString::new(v))
150+
}
151+
}

src/cargo/core/package_id.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,13 @@ impl Hash for PackageId {
113113
}
114114

115115
impl PackageId {
116-
pub fn new<T: ToSemver>(name: &str, version: T, sid: SourceId) -> CargoResult<PackageId> {
116+
pub fn new<T: ToSemver>(
117+
name: impl Into<InternedString>,
118+
version: T,
119+
sid: SourceId,
120+
) -> CargoResult<PackageId> {
117121
let v = version.to_semver()?;
118-
Ok(PackageId::pure(InternedString::new(name), v, sid))
122+
Ok(PackageId::pure(name.into(), v, sid))
119123
}
120124

121125
pub fn pure(name: InternedString, version: semver::Version, source_id: SourceId) -> PackageId {

src/cargo/core/registry.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,7 @@ impl<'cfg> PackageRegistry<'cfg> {
366366
fn query_overrides(&mut self, dep: &Dependency) -> CargoResult<Option<Summary>> {
367367
for &s in self.overrides.iter() {
368368
let src = self.sources.get_mut(s).unwrap();
369-
let dep = Dependency::new_override(&*dep.package_name(), s);
369+
let dep = Dependency::new_override(dep.package_name(), s);
370370
let mut results = src.query_vec(&dep)?;
371371
if !results.is_empty() {
372372
return Ok(Some(results.remove(0)));

src/cargo/core/resolver/dep_cache.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,7 @@ impl Requirements<'_> {
433433
for fv in self
434434
.summary
435435
.features()
436-
.get(feat.as_str())
436+
.get(&feat)
437437
.expect("must be a valid feature")
438438
{
439439
match *fv {

src/cargo/core/summary.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ impl Summary {
3737
pkg_id: PackageId,
3838
dependencies: Vec<Dependency>,
3939
features: &BTreeMap<K, Vec<impl AsRef<str>>>,
40-
links: Option<impl AsRef<str>>,
40+
links: Option<impl Into<InternedString>>,
4141
namespaced_features: bool,
4242
) -> CargoResult<Summary>
4343
where
@@ -66,7 +66,7 @@ impl Summary {
6666
dependencies,
6767
features: feature_map,
6868
checksum: None,
69-
links: links.map(|l| InternedString::new(l.as_ref())),
69+
links: links.map(|l| l.into()),
7070
namespaced_features,
7171
}),
7272
})

src/cargo/sources/registry/index.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -716,7 +716,7 @@ impl IndexSummary {
716716
links,
717717
} = serde_json::from_slice(line)?;
718718
log::trace!("json parsed registry {}/{}", name, vers);
719-
let pkgid = PackageId::new(&name, &vers, source_id)?;
719+
let pkgid = PackageId::new(name, &vers, source_id)?;
720720
let deps = deps
721721
.into_iter()
722722
.map(|dep| dep.into_dep(source_id))

src/cargo/sources/registry/mod.rs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -219,17 +219,18 @@ pub struct RegistryConfig {
219219

220220
#[derive(Deserialize)]
221221
pub struct RegistryPackage<'a> {
222-
name: Cow<'a, str>,
222+
name: InternedString,
223223
vers: Version,
224+
#[serde(borrow)]
224225
deps: Vec<RegistryDependency<'a>>,
225-
features: BTreeMap<Cow<'a, str>, Vec<Cow<'a, str>>>,
226+
features: BTreeMap<InternedString, Vec<InternedString>>,
226227
cksum: String,
227228
yanked: Option<bool>,
228-
links: Option<Cow<'a, str>>,
229+
links: Option<InternedString>,
229230
}
230231

231232
#[test]
232-
fn escaped_cher_in_json() {
233+
fn escaped_char_in_json() {
233234
let _: RegistryPackage<'_> = serde_json::from_str(
234235
r#"{"name":"a","vers":"0.0.1","deps":[],"cksum":"bae3","features":{}}"#,
235236
)
@@ -275,15 +276,16 @@ enum Field {
275276

276277
#[derive(Deserialize)]
277278
struct RegistryDependency<'a> {
278-
name: Cow<'a, str>,
279+
name: InternedString,
280+
#[serde(borrow)]
279281
req: Cow<'a, str>,
280-
features: Vec<Cow<'a, str>>,
282+
features: Vec<InternedString>,
281283
optional: bool,
282284
default_features: bool,
283285
target: Option<Cow<'a, str>>,
284286
kind: Option<Cow<'a, str>>,
285287
registry: Option<Cow<'a, str>>,
286-
package: Option<Cow<'a, str>>,
288+
package: Option<InternedString>,
287289
public: Option<bool>,
288290
}
289291

@@ -309,10 +311,9 @@ impl<'a> RegistryDependency<'a> {
309311
default
310312
};
311313

312-
let mut dep =
313-
Dependency::parse_no_deprecated(package.as_ref().unwrap_or(&name), Some(&req), id)?;
314+
let mut dep = Dependency::parse_no_deprecated(package.unwrap_or(name), Some(&req), id)?;
314315
if package.is_some() {
315-
dep.set_explicit_name_in_toml(&name);
316+
dep.set_explicit_name_in_toml(name);
316317
}
317318
let kind = match kind.as_ref().map(|s| &s[..]).unwrap_or("") {
318319
"dev" => Kind::Development,

0 commit comments

Comments
 (0)