From c5d79552054765e06ec3936ecdf3622fcdd56865 Mon Sep 17 00:00:00 2001 From: Paolo Barbolini Date: Tue, 15 Jul 2025 17:51:29 +0200 Subject: [PATCH 1/5] Bump MSRV to 1.57 --- Cargo.toml | 2 +- clippy.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 7ef12eafc..fc3b13387 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ name = "bytes" # - Create "v1.x.y" git tag. version = "1.10.1" edition = "2018" -rust-version = "1.39" +rust-version = "1.57" license = "MIT" authors = [ "Carl Lerche ", diff --git a/clippy.toml b/clippy.toml index 53095b15d..5cccb362c 100644 --- a/clippy.toml +++ b/clippy.toml @@ -1 +1 @@ -msrv = "1.39" +msrv = "1.57" From dd44ea0d89b588eebb3e28b255db5f8e673957ca Mon Sep 17 00:00:00 2001 From: Paolo Barbolini Date: Tue, 15 Jul 2025 18:19:43 +0200 Subject: [PATCH 2/5] Remove `offset_from` polyfill --- src/bytes.rs | 12 ++++++------ src/bytes_mut.rs | 6 +++--- src/lib.rs | 15 --------------- 3 files changed, 9 insertions(+), 24 deletions(-) diff --git a/src/bytes.rs b/src/bytes.rs index 5c2ca18ad..a29a4a669 100644 --- a/src/bytes.rs +++ b/src/bytes.rs @@ -16,7 +16,7 @@ use crate::buf::IntoIter; #[allow(unused)] use crate::loom::sync::atomic::AtomicMut; use crate::loom::sync::atomic::{AtomicPtr, AtomicUsize, Ordering}; -use crate::{offset_from, Buf, BytesMut}; +use crate::{Buf, BytesMut}; /// A cheaply cloneable and sliceable chunk of contiguous memory. /// @@ -1235,7 +1235,7 @@ unsafe fn promotable_to_vec( let buf = f(shared); - let cap = offset_from(ptr, buf) + len; + let cap = ptr.offset_from(buf) as usize + len; // Copy back buffer ptr::copy(ptr, buf, len); @@ -1263,7 +1263,7 @@ unsafe fn promotable_to_mut( debug_assert_eq!(kind, KIND_VEC); let buf = f(shared); - let off = offset_from(ptr, buf); + let off = ptr.offset_from(buf) as usize; let cap = off + len; let v = Vec::from_raw_parts(buf, cap, cap); @@ -1348,7 +1348,7 @@ unsafe fn promotable_is_unique(data: &AtomicPtr<()>) -> bool { } unsafe fn free_boxed_slice(buf: *mut u8, offset: *const u8, len: usize) { - let cap = offset_from(offset, buf) + len; + let cap = offset.offset_from(buf) as usize + len; dealloc(buf, Layout::from_size_align(cap, 1).unwrap()) } @@ -1444,7 +1444,7 @@ unsafe fn shared_to_mut_impl(shared: *mut Shared, ptr: *const u8, len: usize) -> let cap = shared.cap; // Rebuild Vec - let off = offset_from(ptr, buf); + let off = ptr.offset_from(buf) as usize; let v = Vec::from_raw_parts(buf, len + off, cap); let mut b = BytesMut::from_vec(v); @@ -1510,7 +1510,7 @@ unsafe fn shallow_clone_vec( // vector. let shared = Box::new(Shared { buf, - cap: offset_from(offset, buf) + len, + cap: offset.offset_from(buf) as usize + len, // Initialize refcount to 2. One for this reference, and one // for the new clone that will be returned from // `shallow_clone`. diff --git a/src/bytes_mut.rs b/src/bytes_mut.rs index 739b36ed4..d14a0bd41 100644 --- a/src/bytes_mut.rs +++ b/src/bytes_mut.rs @@ -17,7 +17,7 @@ use crate::bytes::Vtable; #[allow(unused)] use crate::loom::sync::atomic::AtomicMut; use crate::loom::sync::atomic::{AtomicPtr, AtomicUsize, Ordering}; -use crate::{offset_from, Buf, BufMut, Bytes, TryGetError}; +use crate::{Buf, BufMut, Bytes, TryGetError}; /// A unique reference to a contiguous slice of memory. /// @@ -694,7 +694,7 @@ impl BytesMut { let v_capacity = v.capacity(); let ptr = v.as_mut_ptr(); - let offset = offset_from(self.ptr.as_ptr(), ptr); + let offset = self.ptr.as_ptr().offset_from(ptr) as usize; // Compare the condition in the `kind == KIND_VEC` case above // for more details. @@ -1823,7 +1823,7 @@ unsafe fn shared_v_to_mut(data: &AtomicPtr<()>, ptr: *const u8, len: usize) -> B let v = &mut shared.vec; let v_capacity = v.capacity(); let v_ptr = v.as_mut_ptr(); - let offset = offset_from(ptr as *mut u8, v_ptr); + let offset = ptr.offset_from(v_ptr) as usize; let cap = v_capacity - offset; let ptr = vptr(ptr as *mut u8); diff --git a/src/lib.rs b/src/lib.rs index 08c424942..f2fd04d55 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -182,18 +182,3 @@ fn panic_does_not_fit(size: usize, nbytes: usize) -> ! { size, nbytes ); } - -/// Precondition: dst >= original -/// -/// The following line is equivalent to: -/// -/// ```rust,ignore -/// self.ptr.as_ptr().offset_from(ptr) as usize; -/// ``` -/// -/// But due to min rust is 1.39 and it is only stabilized -/// in 1.47, we cannot use it. -#[inline] -fn offset_from(dst: *const u8, original: *const u8) -> usize { - dst as usize - original as usize -} From 47af9b14979c706ab6a1d8a67600f4b9efde9e65 Mon Sep 17 00:00:00 2001 From: Paolo Barbolini Date: Tue, 15 Jul 2025 19:09:51 +0200 Subject: [PATCH 3/5] Use `Copy` impl of `IoSlice` to construct array --- src/buf/take.rs | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/src/buf/take.rs b/src/buf/take.rs index acfeef6e1..d8621f3f3 100644 --- a/src/buf/take.rs +++ b/src/buf/take.rs @@ -163,24 +163,7 @@ impl Buf for Take { } const LEN: usize = 16; - let mut slices: [IoSlice<'a>; LEN] = [ - IoSlice::new(&[]), - IoSlice::new(&[]), - IoSlice::new(&[]), - IoSlice::new(&[]), - IoSlice::new(&[]), - IoSlice::new(&[]), - IoSlice::new(&[]), - IoSlice::new(&[]), - IoSlice::new(&[]), - IoSlice::new(&[]), - IoSlice::new(&[]), - IoSlice::new(&[]), - IoSlice::new(&[]), - IoSlice::new(&[]), - IoSlice::new(&[]), - IoSlice::new(&[]), - ]; + let mut slices: [IoSlice<'a>; LEN] = [IoSlice::new(&[]); LEN]; let cnt = self .inner From 625b63208dfe8ace60c5028ebabd7c921ea73838 Mon Sep 17 00:00:00 2001 From: Paolo Barbolini Date: Tue, 15 Jul 2025 17:59:45 +0200 Subject: [PATCH 4/5] Fix 1.57 clippy warnings --- src/buf/buf_mut.rs | 8 ++++---- src/bytes.rs | 2 +- src/bytes_mut.rs | 6 +++--- tests/test_buf_mut.rs | 1 - tests/test_bytes.rs | 1 - 5 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/buf/buf_mut.rs b/src/buf/buf_mut.rs index 26645c6ae..3154dfeca 100644 --- a/src/buf/buf_mut.rs +++ b/src/buf/buf_mut.rs @@ -3,7 +3,7 @@ use crate::buf::{limit, Chain, Limit, UninitSlice}; use crate::buf::{writer, Writer}; use crate::{panic_advance, panic_does_not_fit, TryGetError}; -use core::{mem, ptr, usize}; +use core::{mem, ptr}; use alloc::{boxed::Box, vec::Vec}; @@ -1503,7 +1503,7 @@ unsafe impl BufMut for &mut [u8] { } // Lifetime dance taken from `impl Write for &mut [u8]`. - let (_, b) = core::mem::replace(self, &mut []).split_at_mut(cnt); + let (_, b) = core::mem::take(self).split_at_mut(cnt); *self = b; } @@ -1559,7 +1559,7 @@ unsafe impl BufMut for &mut [core::mem::MaybeUninit] { } // Lifetime dance taken from `impl Write for &mut [u8]`. - let (_, b) = core::mem::replace(self, &mut []).split_at_mut(cnt); + let (_, b) = core::mem::take(self).split_at_mut(cnt); *self = b; } @@ -1600,7 +1600,7 @@ unsafe impl BufMut for Vec { #[inline] fn remaining_mut(&self) -> usize { // A vector can never have more than isize::MAX bytes - core::isize::MAX as usize - self.len() + isize::MAX as usize - self.len() } #[inline] diff --git a/src/bytes.rs b/src/bytes.rs index a29a4a669..6995c14f7 100644 --- a/src/bytes.rs +++ b/src/bytes.rs @@ -2,7 +2,7 @@ use core::iter::FromIterator; use core::mem::{self, ManuallyDrop}; use core::ops::{Deref, RangeBounds}; use core::ptr::NonNull; -use core::{cmp, fmt, hash, ptr, slice, usize}; +use core::{cmp, fmt, hash, ptr, slice}; use alloc::{ alloc::{dealloc, Layout}, diff --git a/src/bytes_mut.rs b/src/bytes_mut.rs index d14a0bd41..06b551874 100644 --- a/src/bytes_mut.rs +++ b/src/bytes_mut.rs @@ -2,7 +2,7 @@ use core::iter::FromIterator; use core::mem::{self, ManuallyDrop, MaybeUninit}; use core::ops::{Deref, DerefMut}; use core::ptr::{self, NonNull}; -use core::{cmp, fmt, hash, isize, slice, usize}; +use core::{cmp, fmt, hash, slice}; use alloc::{ borrow::{Borrow, BorrowMut}, @@ -1722,7 +1722,7 @@ impl From for Vec { let shared = bytes.data as *mut Shared; if unsafe { (*shared).is_unique() } { - let vec = mem::replace(unsafe { &mut (*shared).vec }, Vec::new()); + let vec = core::mem::take(unsafe { &mut (*shared).vec }); unsafe { release_shared(shared) }; @@ -1797,7 +1797,7 @@ unsafe fn shared_v_to_vec(data: &AtomicPtr<()>, ptr: *const u8, len: usize) -> V let shared = &mut *shared; // Drop shared - let mut vec = mem::replace(&mut shared.vec, Vec::new()); + let mut vec = core::mem::take(&mut shared.vec); release_shared(shared); // Copy back buffer diff --git a/tests/test_buf_mut.rs b/tests/test_buf_mut.rs index 0abeb9f7a..9eb0bffdc 100644 --- a/tests/test_buf_mut.rs +++ b/tests/test_buf_mut.rs @@ -4,7 +4,6 @@ use bytes::buf::UninitSlice; use bytes::{BufMut, BytesMut}; use core::fmt::Write; use core::mem::MaybeUninit; -use core::usize; #[test] fn test_vec_as_mut_buf() { diff --git a/tests/test_bytes.rs b/tests/test_bytes.rs index fb4a0dc17..3ea5b715c 100644 --- a/tests/test_bytes.rs +++ b/tests/test_bytes.rs @@ -5,7 +5,6 @@ use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::Arc; use std::panic::{self, AssertUnwindSafe}; -use std::usize; const LONG: &[u8] = b"mary had a little lamb, little lamb, little lamb"; const SHORT: &[u8] = b"hello world"; From 72c14ee4a5b0eb012c895dae264c34f742531666 Mon Sep 17 00:00:00 2001 From: Paolo Barbolini Date: Tue, 15 Jul 2025 18:03:56 +0200 Subject: [PATCH 5/5] Upgrade to 2021 edition --- Cargo.toml | 2 +- src/bytes.rs | 1 - src/bytes_mut.rs | 1 - src/lib.rs | 2 -- tests/test_bytes.rs | 1 - 5 files changed, 1 insertion(+), 6 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index fc3b13387..e7c246649 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ name = "bytes" # - Update CHANGELOG.md. # - Create "v1.x.y" git tag. version = "1.10.1" -edition = "2018" +edition = "2021" rust-version = "1.57" license = "MIT" authors = [ diff --git a/src/bytes.rs b/src/bytes.rs index 6995c14f7..fdc879cd2 100644 --- a/src/bytes.rs +++ b/src/bytes.rs @@ -1,4 +1,3 @@ -use core::iter::FromIterator; use core::mem::{self, ManuallyDrop}; use core::ops::{Deref, RangeBounds}; use core::ptr::NonNull; diff --git a/src/bytes_mut.rs b/src/bytes_mut.rs index 06b551874..befe16bca 100644 --- a/src/bytes_mut.rs +++ b/src/bytes_mut.rs @@ -1,4 +1,3 @@ -use core::iter::FromIterator; use core::mem::{self, ManuallyDrop, MaybeUninit}; use core::ops::{Deref, DerefMut}; use core::ptr::{self, NonNull}; diff --git a/src/lib.rs b/src/lib.rs index f2fd04d55..fb5c506e8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -114,7 +114,6 @@ fn abort() -> ! { #[inline(always)] #[cfg(feature = "std")] fn saturating_sub_usize_u64(a: usize, b: u64) -> usize { - use core::convert::TryFrom; match usize::try_from(b) { Ok(b) => a.saturating_sub(b), Err(_) => 0, @@ -124,7 +123,6 @@ fn saturating_sub_usize_u64(a: usize, b: u64) -> usize { #[inline(always)] #[cfg(feature = "std")] fn min_u64_usize(a: u64, b: usize) -> usize { - use core::convert::TryFrom; match usize::try_from(a) { Ok(a) => usize::min(a, b), Err(_) => b, diff --git a/tests/test_bytes.rs b/tests/test_bytes.rs index 3ea5b715c..85c007961 100644 --- a/tests/test_bytes.rs +++ b/tests/test_bytes.rs @@ -81,7 +81,6 @@ fn fmt() { #[test] fn fmt_write() { use std::fmt::Write; - use std::iter::FromIterator; let s = String::from_iter((0..10).map(|_| "abcdefg")); let mut a = BytesMut::with_capacity(64);