From ae9991f3ba4f08d9c3d57b240a3c018082a38012 Mon Sep 17 00:00:00 2001
From: Douman <douman@gmx.se>
Date: Fri, 16 Aug 2019 08:50:24 +0200
Subject: [PATCH] Make From only for static slices to Bytes

---
 src/bytes.rs        | 23 ++++++++++++++---------
 tests/test_bytes.rs |  4 ++--
 2 files changed, 16 insertions(+), 11 deletions(-)

diff --git a/src/bytes.rs b/src/bytes.rs
index 99022f0..6a9c959 100644
--- a/src/bytes.rs
+++ b/src/bytes.rs
@@ -499,6 +499,11 @@ impl Bytes {
         self.inner.is_inline()
     }
 
+    ///Creates `Bytes` instance from slice, by copying it.
+    pub fn copy_from_slice(data: &[u8]) -> Self {
+        BytesMut::from(data).freeze()
+    }
+
     /// Returns a slice of self for the provided range.
     ///
     /// This will increment the reference count for the underlying memory and
@@ -542,7 +547,7 @@ impl Bytes {
         assert!(end <= len);
 
         if end - begin <= INLINE_CAP {
-            return Bytes::from(&self[begin..end]);
+            return Bytes::copy_from_slice(&self[begin..end]);
         }
 
         let mut ret = self.clone();
@@ -729,7 +734,7 @@ impl Bytes {
     /// ```
     /// use bytes::Bytes;
     ///
-    /// let a = Bytes::from(&b"Mary had a little lamb, little lamb, little lamb..."[..]);
+    /// let a = Bytes::copy_from_slice(&b"Mary had a little lamb, little lamb, little lamb..."[..]);
     ///
     /// // Create a shallow clone
     /// let b = a.clone();
@@ -759,7 +764,7 @@ impl Bytes {
     /// Clones the data if it is not already owned.
     pub fn to_mut(&mut self) -> &mut BytesMut {
         if !self.inner.is_mut_safe() {
-            let new = Bytes::from(&self[..]);
+            let new = Self::copy_from_slice(&self[..]);
             *self = new;
         }
         unsafe { &mut *(self as *mut Bytes as *mut BytesMut) }
@@ -922,15 +927,15 @@ impl From<String> for Bytes {
     }
 }
 
-impl<'a> From<&'a [u8]> for Bytes {
-    fn from(src: &'a [u8]) -> Bytes {
-        BytesMut::from(src).freeze()
+impl From<&'static [u8]> for Bytes {
+    fn from(src: &'static [u8]) -> Bytes {
+        Bytes::from_static(src)
     }
 }
 
-impl<'a> From<&'a str> for Bytes {
-    fn from(src: &'a str) -> Bytes {
-        BytesMut::from(src).freeze()
+impl From<&'static str> for Bytes {
+    fn from(src: &'static str) -> Bytes {
+        Bytes::from_static(src.as_bytes())
     }
 }
 
diff --git a/tests/test_bytes.rs b/tests/test_bytes.rs
index 3c51ac5..7334523 100644
--- a/tests/test_bytes.rs
+++ b/tests/test_bytes.rs
@@ -528,7 +528,7 @@ fn stress() {
 
     for i in 0..ITERS {
         let data = [i as u8; 256];
-        let buf = Arc::new(Bytes::from(&data[..]));
+        let buf = Arc::new(Bytes::copy_from_slice(&data[..]));
 
         let barrier = Arc::new(Barrier::new(THREADS));
         let mut joins = Vec::with_capacity(THREADS);
@@ -888,7 +888,7 @@ fn slice_ref_catches_not_an_empty_subset() {
 #[test]
 #[should_panic]
 fn empty_slice_ref_catches_not_an_empty_subset() {
-    let bytes = Bytes::from(&b""[..]);
+    let bytes = Bytes::copy_from_slice(&b""[..]);
     let slice = &b""[0..0];
 
     bytes.slice_ref(slice);
-- 
GitLab