]> git.proxmox.com Git - cargo.git/commitdiff
use `into_boxed_str` to shrink before we leek
authorEh2406 <YeomanYaacov@gmail.com>
Wed, 7 Mar 2018 22:10:55 +0000 (17:10 -0500)
committerEh2406 <YeomanYaacov@gmail.com>
Wed, 7 Mar 2018 22:10:55 +0000 (17:10 -0500)
src/cargo/core/interning.rs

index 16f9c134742e0c792b919ce5f437b5e1db4da09e..f8d028b3455024ec5e0115e035ef037beba86597 100644 (file)
@@ -4,11 +4,13 @@ use std::collections::HashSet;
 use std::slice;
 use std::str;
 use std::mem;
+use std::cmp::Ordering;
 
 pub fn leek(s: String) -> &'static str {
-    let ptr = s.as_ptr();
-    let len = s.len();
-    mem::forget(s);
+    let boxed = s.into_boxed_str();
+    let ptr = boxed.as_ptr();
+    let len = boxed.len();
+    mem::forget(boxed);
     unsafe {
         let slice = slice::from_raw_parts(ptr, len);
         str::from_utf8_unchecked(slice)
@@ -49,3 +51,18 @@ impl fmt::Debug for InternedString {
         write!(f, "InternedString {{ {} }}", self.to_inner())
     }
 }
+
+impl Ord for InternedString {
+    fn cmp(&self, other: &InternedString) -> Ordering {
+        self.to_inner().cmp(&other.to_inner())
+    }
+}
+
+impl PartialOrd for InternedString {
+    fn partial_cmp(&self, other: &InternedString) -> Option<Ordering> {
+        Some(self.cmp(other))
+    }
+}
+
+unsafe impl Send for InternedString {}
+unsafe impl Sync for InternedString {}
\ No newline at end of file