From 833b2b43eef0af7e05106bf6618c036dee737a88 Mon Sep 17 00:00:00 2001 From: sb123sb123 <152394158+sb123sb123@users.noreply.github.com> Date: Tue, 22 Sep 2026 08:30:14 +0800 Subject: [PATCH 1/3] Implement From> for Bytes --- src/bytes.rs | 10 ++++++++++ tests/test_bytes.rs | 11 +++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/bytes.rs b/src/bytes.rs index aed4d7cdb..f693ff9aa 100644 --- a/src/bytes.rs +++ b/src/bytes.rs @@ -11,6 +11,9 @@ use alloc::{ vec::Vec, }; +#[cfg(target_has_atomic = "ptr")] +use alloc::sync::Arc; + use crate::buf::IntoIter; #[allow(unused)] use crate::loom::sync::atomic::AtomicMut; @@ -1014,6 +1017,13 @@ impl From> for Bytes { } } +#[cfg(target_has_atomic = "ptr")] +impl From> for Bytes { + fn from(arc: Arc<[u8]>) -> Bytes { + Bytes::from_owner(arc) + } +} + impl From for BytesMut { /// Convert self into `BytesMut`. /// diff --git a/tests/test_bytes.rs b/tests/test_bytes.rs index 5d01b5b82..c0440290b 100644 --- a/tests/test_bytes.rs +++ b/tests/test_bytes.rs @@ -67,6 +67,17 @@ fn from_slice() { assert_eq!(Vec::from(&b"abcdefgh"[..]), a); } +#[test] +fn from_arc() { + let source: Arc<[u8]> = Arc::from(&b"abcdefgh"[..]); + let source_ptr = source.as_ptr(); + let bytes = Bytes::from(source.clone()); + drop(source); + + assert_eq!(bytes, b"abcdefgh"[..]); + assert_eq!(bytes.as_ptr(), source_ptr); +} + #[test] fn fmt() { let a = format!("{:?}", Bytes::from(&b"abcdefg"[..])); From ca93cf66e873f78c5c2dae1250e4c47db777f497 Mon Sep 17 00:00:00 2001 From: NekoPaw <152394158+sb123sb123@users.noreply.github.com> Date: Tue, 29 Sep 2026 17:04:50 +0800 Subject: [PATCH 2/3] test: gate Arc conversion on pointer atomics --- tests/test_bytes.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_bytes.rs b/tests/test_bytes.rs index c0440290b..2050d9273 100644 --- a/tests/test_bytes.rs +++ b/tests/test_bytes.rs @@ -67,6 +67,7 @@ fn from_slice() { assert_eq!(Vec::from(&b"abcdefgh"[..]), a); } +#[cfg(target_has_atomic = "ptr")] #[test] fn from_arc() { let source: Arc<[u8]> = Arc::from(&b"abcdefgh"[..]); From 321d3cb9f576eeb9ae7b87d07da6db14e39c5b3f Mon Sep 17 00:00:00 2001 From: NekoPaw <152394158+sb123sb123@users.noreply.github.com> Date: Tue, 29 Sep 2026 10:09:09 +0000 Subject: [PATCH 3/3] fix: keep Arc cfg compatible with Rust 1.57 --- build.rs | 10 ++++++++++ src/bytes.rs | 4 ++-- tests/test_bytes.rs | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 build.rs diff --git a/build.rs b/build.rs new file mode 100644 index 000000000..356f97187 --- /dev/null +++ b/build.rs @@ -0,0 +1,10 @@ +use std::env; + +fn main() { + println!("cargo:rustc-check-cfg=cfg(bytes_has_atomic_ptr)"); + + let target_atomics = env::var("CARGO_CFG_TARGET_HAS_ATOMIC").unwrap_or_default(); + if target_atomics.split(',').any(|atomic| atomic == "ptr") { + println!("cargo:rustc-cfg=bytes_has_atomic_ptr"); + } +} diff --git a/src/bytes.rs b/src/bytes.rs index f693ff9aa..86f06195d 100644 --- a/src/bytes.rs +++ b/src/bytes.rs @@ -11,7 +11,7 @@ use alloc::{ vec::Vec, }; -#[cfg(target_has_atomic = "ptr")] +#[cfg(bytes_has_atomic_ptr)] use alloc::sync::Arc; use crate::buf::IntoIter; @@ -1017,7 +1017,7 @@ impl From> for Bytes { } } -#[cfg(target_has_atomic = "ptr")] +#[cfg(bytes_has_atomic_ptr)] impl From> for Bytes { fn from(arc: Arc<[u8]>) -> Bytes { Bytes::from_owner(arc) diff --git a/tests/test_bytes.rs b/tests/test_bytes.rs index 2050d9273..5615d92d1 100644 --- a/tests/test_bytes.rs +++ b/tests/test_bytes.rs @@ -67,7 +67,7 @@ fn from_slice() { assert_eq!(Vec::from(&b"abcdefgh"[..]), a); } -#[cfg(target_has_atomic = "ptr")] +#[cfg(bytes_has_atomic_ptr)] #[test] fn from_arc() { let source: Arc<[u8]> = Arc::from(&b"abcdefgh"[..]);