PackageId.name to InternedString
authorEh2406 <YeomanYaacov@gmail.com>
Thu, 8 Mar 2018 21:24:27 +0000 (16:24 -0500)
committerEh2406 <YeomanYaacov@gmail.com>
Thu, 8 Mar 2018 22:55:22 +0000 (17:55 -0500)
14 files changed:
src/cargo/core/dependency.rs
src/cargo/core/interning.rs
src/cargo/core/manifest.rs
src/cargo/core/package.rs
src/cargo/core/package_id.rs
src/cargo/core/package_id_spec.rs
src/cargo/core/registry.rs
src/cargo/core/resolver/mod.rs
src/cargo/core/summary.rs
src/cargo/ops/cargo_generate_lockfile.rs
src/cargo/ops/cargo_rustc/context.rs
src/cargo/sources/registry/index.rs
src/cargo/sources/registry/mod.rs
src/cargo/sources/registry/remote.rs

index 00fddd499089355751768561a64de9e7dd9faab6..e80113d10ab6c93fc19665056737a1ebbe5a7003 100644 (file)
@@ -329,13 +329,13 @@ impl Dependency {
 
     /// Returns true if the package (`sum`) can fulfill this dependency request.
     pub fn matches_ignoring_source(&self, sum: &Summary) -> bool {
-        self.name() == sum.package_id().name() &&
+        self.name() == &*sum.package_id().name() &&
             self.version_req().matches(sum.package_id().version())
     }
 
     /// Returns true if the package (`id`) can fulfill this dependency request.
     pub fn matches_id(&self, id: &PackageId) -> bool {
-        self.inner.name == id.name() &&
+        self.inner.name == &*id.name() &&
             (self.inner.only_match_name || (self.inner.req.matches(id.version()) &&
                                       &self.inner.source_id == id.source_id()))
     }
index 45dde58105c48dede0c51a65f680958933af7770..1a0722eb135570c9b69dab9c4c34015cf58903af 100644 (file)
@@ -6,6 +6,7 @@ use std::str;
 use std::mem;
 use std::cmp::Ordering;
 use std::ops::Deref;
+use std::hash::{Hash, Hasher};
 
 pub fn leek(s: String) -> &'static str {
     let boxed = s.into_boxed_str();
@@ -23,7 +24,7 @@ lazy_static! {
         RwLock::new(HashSet::new());
 }
 
-#[derive(Eq, PartialEq, Hash, Clone, Copy)]
+#[derive(Eq, PartialEq, Clone, Copy)]
 pub struct InternedString {
     ptr: *const u8,
     len: usize,
@@ -39,30 +40,43 @@ impl InternedString {
         cache.insert(s);
         InternedString { ptr: s.as_ptr(), len: s.len() }
     }
+    pub fn to_inner(&self) -> &'static str {
+        unsafe {
+            let slice = slice::from_raw_parts(self.ptr, self.len);
+            &str::from_utf8_unchecked(slice)
+        }
+    }
 }
 
 impl Deref for InternedString {
     type Target = str;
 
     fn deref(&self) -> &'static str {
-        unsafe {
-            let slice = slice::from_raw_parts(self.ptr, self.len);
-            &str::from_utf8_unchecked(slice)
-        }
+        self.to_inner()
+    }
+}
+
+impl Hash for InternedString {
+    fn hash<H: Hasher>(&self, state: &mut H) {
+        self.to_inner().hash(state);
     }
 }
 
 impl fmt::Debug for InternedString {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        let str: &str = &*self;
-        write!(f, "InternedString {{ {} }}", str)
+        write!(f, "InternedString {{ {} }}", self.to_inner())
+    }
+}
+
+impl fmt::Display for InternedString {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{}", self.to_inner())
     }
 }
 
 impl Ord for InternedString {
     fn cmp(&self, other: &InternedString) -> Ordering {
-        let str: &str = &*self;
-        str.cmp(&*other)
+        self.to_inner().cmp(&*other)
     }
 }
 
index 557380d6c50e173346b76f8320602031b9fc6480..f247b2a51f73ede325582f34829d2d24f8e4ba9c 100644 (file)
@@ -301,7 +301,7 @@ impl Manifest {
     pub fn exclude(&self) -> &[String] { &self.exclude }
     pub fn include(&self) -> &[String] { &self.include }
     pub fn metadata(&self) -> &ManifestMetadata { &self.metadata }
-    pub fn name(&self) -> &str { self.package_id().name() }
+    pub fn name(&self) -> &str { self.package_id().name().to_inner() }
     pub fn package_id(&self) -> &PackageId { self.summary.package_id() }
     pub fn summary(&self) -> &Summary { &self.summary }
     pub fn targets(&self) -> &[Target] { &self.targets }
index 252b7ac836e1c068a953e4c22698d242c64a4faa..19c95e5fc100d900fa13c59ae47c61879efa9870 100644 (file)
@@ -55,7 +55,7 @@ impl ser::Serialize for Package {
         let description = manmeta.description.as_ref().map(String::as_ref);
 
         SerializedPackage {
-            name: package_id.name(),
+            name: &*package_id.name(),
             version: &package_id.version().to_string(),
             id: package_id,
             license,
@@ -95,7 +95,7 @@ impl Package {
     /// Get the path to the manifest
     pub fn manifest_path(&self) -> &Path { &self.manifest_path }
     /// Get the name of the package
-    pub fn name(&self) -> &str { self.package_id().name() }
+    pub fn name(&self) -> &str { self.package_id().name().to_inner() }
     /// Get the PackageId object for the package (fully defines a package)
     pub fn package_id(&self) -> &PackageId { self.manifest.package_id() }
     /// Get the root folder of the package
index ffb4330c627c3ab0999e8b9a21cb20da45b5c8aa..1b8133829d8a2a368a9c321c93fbf2282f3cd44e 100644 (file)
@@ -11,6 +11,7 @@ use serde::ser;
 
 use util::{CargoResult, ToSemver};
 use core::source::SourceId;
+use core::interning::InternedString;
 
 /// Identifier for a specific version of a package in a specific source.
 #[derive(Clone)]
@@ -20,7 +21,7 @@ pub struct PackageId {
 
 #[derive(PartialEq, PartialOrd, Eq, Ord)]
 struct PackageIdInner {
-    name: String,
+    name: InternedString,
     version: semver::Version,
     source_id: SourceId,
 }
@@ -63,7 +64,7 @@ impl<'de> de::Deserialize<'de> for PackageId {
 
         Ok(PackageId {
             inner: Arc::new(PackageIdInner {
-                name: name.to_string(),
+                name: InternedString::new(name),
                 version,
                 source_id,
             }),
@@ -102,21 +103,21 @@ impl PackageId {
         let v = version.to_semver()?;
         Ok(PackageId {
             inner: Arc::new(PackageIdInner {
-                name: name.to_string(),
+                name: InternedString::new(name),
                 version: v,
                 source_id: sid.clone(),
             }),
         })
     }
 
-    pub fn name(&self) -> &str { &self.inner.name }
+    pub fn name(&self) -> InternedString { self.inner.name }
     pub fn version(&self) -> &semver::Version { &self.inner.version }
     pub fn source_id(&self) -> &SourceId { &self.inner.source_id }
 
     pub fn with_precise(&self, precise: Option<String>) -> PackageId {
         PackageId {
             inner: Arc::new(PackageIdInner {
-                name: self.inner.name.to_string(),
+                name: self.inner.name,
                 version: self.inner.version.clone(),
                 source_id: self.inner.source_id.with_precise(precise),
             }),
@@ -126,7 +127,7 @@ impl PackageId {
     pub fn with_source_id(&self, source: &SourceId) -> PackageId {
         PackageId {
             inner: Arc::new(PackageIdInner {
-                name: self.inner.name.to_string(),
+                name: self.inner.name,
                 version: self.inner.version.clone(),
                 source_id: source.clone(),
             }),
index be1170be4a7b13573be885fa7689dd4022eb9d59..065534f70697da31d79680090d884c4f9e786fe7 100644 (file)
@@ -115,7 +115,7 @@ impl PackageIdSpec {
     }
 
     pub fn matches(&self, package_id: &PackageId) -> bool {
-        if self.name() != package_id.name() { return false }
+        if self.name() != &*package_id.name() { return false }
 
         if let Some(ref v) = self.version {
             if v != package_id.version() {
index 051adb84efc7bbe8c1991f6db386108acba97a09..f7ab320c9f2de4a0407eb4becfc1490a46fdf76c 100644 (file)
@@ -584,7 +584,7 @@ fn lock(locked: &LockedMap,
         let v = patches.get(dep.source_id().url()).map(|vec| {
             let dep2 = dep.clone();
             let mut iter = vec.iter().filter(move |p| {
-                dep2.name() == p.name() &&
+                dep2.name() == &*p.name() &&
                     dep2.version_req().matches(p.version())
             });
             (iter.next(), iter)
@@ -593,7 +593,7 @@ fn lock(locked: &LockedMap,
             assert!(remaining.next().is_none());
             let patch_source = patch_id.source_id();
             let patch_locked = locked.get(patch_source).and_then(|m| {
-                m.get(patch_id.name())
+                m.get(&*patch_id.name())
             }).map(|list| {
                 list.iter().any(|&(ref id, _)| id == patch_id)
             }).unwrap_or(false);
index 6edc410c04df1856c721434d02482d696a358b9d..c1023566a1195ea7230584730dbcd09a189a36cb 100644 (file)
@@ -1059,7 +1059,7 @@ fn activation_error(cx: &Context,
         for &(p, r) in features_errors.iter() {
             if let ConflictReason::MissingFeatures(ref features) = *r {
                 msg.push_str("\n\nthe package `");
-                msg.push_str(p.name());
+                msg.push_str(&*p.name());
                 msg.push_str("` depends on `");
                 msg.push_str(dep.name());
                 msg.push_str("`, with features: `");
@@ -1304,7 +1304,7 @@ impl Context {
                       method: &Method) -> CargoResult<bool> {
         let id = summary.package_id();
         let prev = self.activations
-                       .entry((InternedString::new(id.name()), id.source_id().clone()))
+                       .entry((id.name(), id.source_id().clone()))
                        .or_insert_with(||Rc::new(Vec::new()));
         if !prev.iter().any(|c| c == summary) {
             self.resolve_graph.push(GraphNode::Add(id.clone()));
@@ -1371,7 +1371,7 @@ impl Context {
     }
 
     fn is_active(&self, id: &PackageId) -> bool {
-        self.activations.get(&(InternedString::new(id.name()), id.source_id().clone()))
+        self.activations.get(&(id.name(), id.source_id().clone()))
             .map(|v| v.iter().any(|s| s.package_id() == id))
             .unwrap_or(false)
     }
index 4144fde98a84fbc0873be59c36dc8779e693e510..973e6cfe4327e40f129354eb6012d679a51272e2 100644 (file)
@@ -78,7 +78,7 @@ impl Summary {
     }
 
     pub fn package_id(&self) -> &PackageId { &self.inner.package_id }
-    pub fn name(&self) -> &str { self.package_id().name() }
+    pub fn name(&self) -> &str { self.package_id().name().to_inner() }
     pub fn version(&self) -> &Version { self.package_id().version() }
     pub fn source_id(&self) -> &SourceId { self.package_id().source_id() }
     pub fn dependencies(&self) -> &[Dependency] { &self.inner.dependencies }
index d08c11b1662e37221d053d5b4805a6bd768fbded..a22974d24f90f28e0171b3132d1d8917dbec71a1 100644 (file)
@@ -136,7 +136,7 @@ pub fn update_lockfile(ws: &Workspace, opts: &UpdateOptions)
                                      resolve: &'a Resolve) ->
                                      Vec<(Vec<&'a PackageId>, Vec<&'a PackageId>)> {
         fn key(dep: &PackageId) -> (&str, &SourceId) {
-            (dep.name(), dep.source_id())
+            (dep.name().to_inner(), dep.source_id())
         }
 
         // Removes all package ids in `b` from `a`. Note that this is somewhat
index a23e9fe03d0f526ce6fcfa89ed1a7707a87cef2e..9944df7e2ea8d74da4ac6c1018915866daed8c80 100644 (file)
@@ -782,7 +782,7 @@ impl<'a, 'cfg> Context<'a, 'cfg> {
         let deps = self.resolve.deps(id);
         let mut ret = deps.filter(|dep| {
             unit.pkg.dependencies().iter().filter(|d| {
-                d.name() == dep.name() && d.version_req().matches(dep.version())
+                d.name() == &*dep.name() && d.version_req().matches(dep.version())
             }).any(|d| {
                 // If this target is a build command, then we only want build
                 // dependencies, otherwise we want everything *other than* build
@@ -915,7 +915,7 @@ impl<'a, 'cfg> Context<'a, 'cfg> {
     fn doc_deps(&self, unit: &Unit<'a>) -> CargoResult<Vec<Unit<'a>>> {
         let deps = self.resolve.deps(unit.pkg.package_id()).filter(|dep| {
             unit.pkg.dependencies().iter().filter(|d| {
-                d.name() == dep.name()
+                d.name() == &*dep.name()
             }).any(|dep| {
                 match dep.kind() {
                     DepKind::Normal => self.dep_platform_activated(dep,
index d3135bac365c8510c517da7019dbf89a7c826658..43306be14a60d342c70da7eb1fded1675e973db5 100644 (file)
@@ -41,7 +41,7 @@ impl<'cfg> RegistryIndex<'cfg> {
                 pkg: &PackageId,
                 load: &mut RegistryData)
                 -> CargoResult<String> {
-        let name = pkg.name();
+        let name = &*pkg.name();
         let version = pkg.version();
         if let Some(s) = self.hashes.get(name).and_then(|v| v.get(version)) {
             return Ok(s.clone())
index 18ff758971074d98b58dfcb42f79cf007a9c7d82..cb2b9fc1e6355a50ab4ebfb9ad0e8526c8e00a6d 100644 (file)
@@ -435,7 +435,7 @@ impl<'cfg> Source for RegistrySource<'cfg> {
         // differ due to historical Cargo bugs. To paper over these we trash the
         // *summary* loaded from the Cargo.toml we just downloaded with the one
         // we loaded from the index.
-        let summaries = self.index.summaries(package.name(), &mut *self.ops)?;
+        let summaries = self.index.summaries(&*package.name(), &mut *self.ops)?;
         let summary = summaries.iter().map(|s| &s.0).find(|s| {
             s.package_id() == package
         }).expect("summary not found");
index 47f940f9274632f1a092799eb82d49efb566ae97..d09b6d531187155eb5a339b91c1f8e7a9878c508 100644 (file)
@@ -217,7 +217,7 @@ impl<'cfg> RegistryData for RemoteRegistry<'cfg> {
             write!(url, "/{}/{}/download", CRATE_TEMPLATE, VERSION_TEMPLATE).unwrap();
         }
         let url = url
-            .replace(CRATE_TEMPLATE, pkg.name())
+            .replace(CRATE_TEMPLATE, &*pkg.name())
             .replace(VERSION_TEMPLATE, &pkg.version().to_string())
             .to_url()?;