diff --git a/src/bytes.rs b/src/bytes.rs index 094d0357a818ab0716b0417d7c460c9e6b8a8616..f5ac05a67b101037abf474cbd853c42a0686c49f 100644 --- a/src/bytes.rs +++ b/src/bytes.rs @@ -295,6 +295,8 @@ pub struct BytesMut { #[cfg(target_endian = "little")] #[repr(C)] struct Inner { + // WARNING: Do not access the fields directly unless you know what you are + // doing. Instead, use the fns. See implementation comment above. arc: AtomicPtr<Shared>, ptr: *mut u8, len: usize, @@ -304,6 +306,8 @@ struct Inner { #[cfg(target_endian = "big")] #[repr(C)] struct Inner { + // WARNING: Do not access the fields directly unless you know what you are + // doing. Instead, use the fns. See implementation comment above. ptr: *mut u8, len: usize, cap: usize, @@ -1401,6 +1405,15 @@ impl BytesMut { pub fn unsplit(&mut self, other: BytesMut) { let ptr; + if other.is_empty() { + return; + } + + if self.is_empty() { + *self = other; + return; + } + unsafe { ptr = self.inner.ptr.offset(self.inner.len as isize); } @@ -1415,7 +1428,7 @@ impl BytesMut { self.inner.cap += other.inner.cap; } else { - self.extend(other); + self.extend_from_slice(&other); } } } diff --git a/tests/test_bytes.rs b/tests/test_bytes.rs index e5b1fe7fd3a7f3edf7e67c03e9f6b7f3aa400786..15c315748367403aad4b81a8fbe258e11c218a3d 100644 --- a/tests/test_bytes.rs +++ b/tests/test_bytes.rs @@ -566,6 +566,30 @@ fn unsplit_basic() { assert_eq!(b"aaabbbcccddd", &buf[..]); } +#[test] +fn unsplit_empty_other() { + let mut buf = BytesMut::with_capacity(64); + buf.extend_from_slice(b"aaabbbcccddd"); + + // empty other + let other = BytesMut::new(); + + buf.unsplit(other); + assert_eq!(b"aaabbbcccddd", &buf[..]); +} + +#[test] +fn unsplit_empty_self() { + // empty self + let mut buf = BytesMut::new(); + + let mut other = BytesMut::with_capacity(64); + other.extend_from_slice(b"aaabbbcccddd"); + + buf.unsplit(other); + assert_eq!(b"aaabbbcccddd", &buf[..]); +} + #[test] fn unsplit_inline_arc() { let mut buf = BytesMut::with_capacity(8); //inline