This is an automated email from the ASF dual-hosted git repository.
alamb pushed a commit to branch 53.0.0-dev
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git
The following commit(s) were added to refs/heads/53.0.0-dev by this push:
new 8f76248222 Remove `impl<T: AsRef<[u8]>> From<T> for Buffer` that
easily accidentally copies data (#6043)
8f76248222 is described below
commit 8f762482221a4b2104a770d1c132dea3b58c117d
Author: Xiangpeng Hao <[email protected]>
AuthorDate: Tue Jul 16 18:06:57 2024 -0400
Remove `impl<T: AsRef<[u8]>> From<T> for Buffer` that easily accidentally
copies data (#6043)
* deprecate auto copy, ask explicit reference
* update comments
* make cargo doc happy
---
arrow-buffer/src/buffer/immutable.rs | 33 +++++++++++++++++++++++----------
1 file changed, 23 insertions(+), 10 deletions(-)
diff --git a/arrow-buffer/src/buffer/immutable.rs
b/arrow-buffer/src/buffer/immutable.rs
index 52e201ca15..c53ef18ba5 100644
--- a/arrow-buffer/src/buffer/immutable.rs
+++ b/arrow-buffer/src/buffer/immutable.rs
@@ -356,16 +356,29 @@ impl Buffer {
}
}
-/// Creating a `Buffer` instance by copying the memory from a `AsRef<[u8]>`
into a newly
-/// allocated memory region.
-impl<T: AsRef<[u8]>> From<T> for Buffer {
- fn from(p: T) -> Self {
- // allocate aligned memory buffer
- let slice = p.as_ref();
- let len = slice.len();
- let mut buffer = MutableBuffer::new(len);
- buffer.extend_from_slice(slice);
- buffer.into()
+/// Note that here we deliberately do not implement
+/// `impl<T: AsRef<[u8]>> From<T> for Buffer`
+/// As it would accept `Buffer::from(vec![...])` that would cause an
unexpected copy.
+/// Instead, we ask user to be explicit when copying is occurring, e.g.,
`Buffer::from(vec![...].to_byte_slice())`.
+/// For zero-copy conversion, user should use `Buffer::from_vec(vec![...])`.
+///
+/// Since we removed impl for `AsRef<u8>`, we added the following three
specific implementations to reduce API breakage.
+/// See <https://github.com/apache/arrow-rs/issues/6033> for more discussion
on this.
+impl From<&[u8]> for Buffer {
+ fn from(p: &[u8]) -> Self {
+ Self::from_slice_ref(p)
+ }
+}
+
+impl<const N: usize> From<[u8; N]> for Buffer {
+ fn from(p: [u8; N]) -> Self {
+ Self::from_slice_ref(p)
+ }
+}
+
+impl<const N: usize> From<&[u8; N]> for Buffer {
+ fn from(p: &[u8; N]) -> Self {
+ Self::from_slice_ref(p)
}
}