about summary refs log tree commit diff
path: root/src/liballoc
diff options
context:
space:
mode:
authorAnthony Ramine <n.oxyde@gmail.com>2018-03-31 23:19:02 +0200
committerAnthony Ramine <n.oxyde@gmail.com>2018-04-01 11:56:23 +0200
commit360f2f036d14889f4de37a8b4b6aad0d09772aad (patch)
tree1635a617fe742c3d3c08ed120acb15034a807a99 /src/liballoc
parent8dd24c8ed4ac3e48068408fa21d491d7ffe45295 (diff)
downloadrust-360f2f036d14889f4de37a8b4b6aad0d09772aad.tar.gz
rust-360f2f036d14889f4de37a8b4b6aad0d09772aad.zip
Inline most of the code paths for conversions with boxed slices
This helps with the specific problem described in #49541, obviously without
making any large change to how inlining works in the general case.

Everything involved in the conversions is made `#[inline]`, except for the
`<Vec<T>>::into_boxed_slice` entry point which is made `#[inline(always)]`
after checking that duplicating the function mentioned in the issue prevented
its inlining if I only annotate it with `#[inline]`.

For the record, that function was:

```rust
pub fn foo() -> Box<[u8]> {
    vec![0].into_boxed_slice()
}
```

To help the inliner's job, we also hoist a `self.capacity() != self.len` check
in `<Vec<T>>::shrink_to_fit` and mark it as `#[inline]` too.
Diffstat (limited to 'src/liballoc')
-rw-r--r--src/liballoc/boxed.rs2
-rw-r--r--src/liballoc/str.rs3
-rw-r--r--src/liballoc/string.rs1
-rw-r--r--src/liballoc/vec.rs6
4 files changed, 11 insertions, 1 deletions
diff --git a/src/liballoc/boxed.rs b/src/liballoc/boxed.rs
index fdc3ef4efb8..2fc60a799f3 100644
--- a/src/liballoc/boxed.rs
+++ b/src/liballoc/boxed.rs
@@ -577,6 +577,7 @@ impl<'a, T: Copy> From<&'a [T]> for Box<[T]> {
 
 #[stable(feature = "box_from_slice", since = "1.17.0")]
 impl<'a> From<&'a str> for Box<str> {
+    #[inline]
     fn from(s: &'a str) -> Box<str> {
         unsafe { from_boxed_utf8_unchecked(Box::from(s.as_bytes())) }
     }
@@ -584,6 +585,7 @@ impl<'a> From<&'a str> for Box<str> {
 
 #[stable(feature = "boxed_str_conv", since = "1.19.0")]
 impl From<Box<str>> for Box<[u8]> {
+    #[inline]
     fn from(s: Box<str>) -> Self {
         unsafe { Box::from_raw(Box::into_raw(s) as *mut [u8]) }
     }
diff --git a/src/liballoc/str.rs b/src/liballoc/str.rs
index d5ef41df0d8..6f05c52eb57 100644
--- a/src/liballoc/str.rs
+++ b/src/liballoc/str.rs
@@ -1811,6 +1811,7 @@ impl str {
     /// assert_eq!(*boxed_bytes, *s.as_bytes());
     /// ```
     #[stable(feature = "str_box_extras", since = "1.20.0")]
+    #[inline]
     pub fn into_boxed_bytes(self: Box<str>) -> Box<[u8]> {
         self.into()
     }
@@ -2049,6 +2050,7 @@ impl str {
     /// assert_eq!(boxed_str.into_string(), string);
     /// ```
     #[stable(feature = "box_str", since = "1.4.0")]
+    #[inline]
     pub fn into_string(self: Box<str>) -> String {
         let slice = Box::<[u8]>::from(self);
         unsafe { String::from_utf8_unchecked(slice.into_vec()) }
@@ -2307,6 +2309,7 @@ impl str {
 /// assert_eq!("☺", &*smile);
 /// ```
 #[stable(feature = "str_box_extras", since = "1.20.0")]
+#[inline]
 pub unsafe fn from_boxed_utf8_unchecked(v: Box<[u8]>) -> Box<str> {
     Box::from_raw(Box::into_raw(v) as *mut str)
 }
diff --git a/src/liballoc/string.rs b/src/liballoc/string.rs
index aa202e23628..95d5b30b67d 100644
--- a/src/liballoc/string.rs
+++ b/src/liballoc/string.rs
@@ -1587,6 +1587,7 @@ impl String {
     /// let b = s.into_boxed_str();
     /// ```
     #[stable(feature = "box_str", since = "1.4.0")]
+    #[inline]
     pub fn into_boxed_str(self) -> Box<str> {
         let slice = self.vec.into_boxed_slice();
         unsafe { from_boxed_utf8_unchecked(slice) }
diff --git a/src/liballoc/vec.rs b/src/liballoc/vec.rs
index 2eedb964f88..e3c036e6aac 100644
--- a/src/liballoc/vec.rs
+++ b/src/liballoc/vec.rs
@@ -582,8 +582,11 @@ impl<T> Vec<T> {
     /// assert!(vec.capacity() >= 3);
     /// ```
     #[stable(feature = "rust1", since = "1.0.0")]
+    #[inline]
     pub fn shrink_to_fit(&mut self) {
-        self.buf.shrink_to_fit(self.len);
+        if self.capacity() != self.len {
+            self.buf.shrink_to_fit(self.len);
+        }
     }
 
     /// Shrinks the capacity of the vector with a lower bound.
@@ -636,6 +639,7 @@ impl<T> Vec<T> {
     /// assert_eq!(slice.into_vec().capacity(), 3);
     /// ```
     #[stable(feature = "rust1", since = "1.0.0")]
+    #[inline(always)]
     pub fn into_boxed_slice(mut self) -> Box<[T]> {
         unsafe {
             self.shrink_to_fit();