summaryrefslogtreecommitdiff
path: root/serde_v8/magic/rawbytes.rs
diff options
context:
space:
mode:
authorDivy Srivastava <dj.srivastava23@gmail.com>2022-09-01 16:01:48 +0530
committerGitHub <noreply@github.com>2022-09-01 16:01:48 +0530
commit73b4597dec5b4dd27b64a6a117945ced99ffe6c6 (patch)
tree84f39c630a09d74cbbc4a9a6e7cebc635ff5ebae /serde_v8/magic/rawbytes.rs
parente267ec6ed5002a3e300e948d2bcb883d260ac89b (diff)
fix(serde_v8): update bytes::Bytes layout assumptions (#15718)
Diffstat (limited to 'serde_v8/magic/rawbytes.rs')
-rw-r--r--serde_v8/magic/rawbytes.rs24
1 files changed, 24 insertions, 0 deletions
diff --git a/serde_v8/magic/rawbytes.rs b/serde_v8/magic/rawbytes.rs
index 4e41d313a..b45143711 100644
--- a/serde_v8/magic/rawbytes.rs
+++ b/serde_v8/magic/rawbytes.rs
@@ -26,11 +26,25 @@ impl RawBytes {
}
}
+// Validate some bytes::Bytes layout assumptions at compile time.
+const _: () = {
+ assert!(
+ core::mem::size_of::<RawBytes>() == core::mem::size_of::<bytes::Bytes>(),
+ );
+ assert!(
+ core::mem::align_of::<RawBytes>() == core::mem::align_of::<bytes::Bytes>(),
+ );
+};
+
#[allow(unused)]
pub(crate) struct Vtable {
/// fn(data, ptr, len)
pub clone: unsafe fn(&AtomicPtr<()>, *const u8, usize) -> bytes::Bytes,
/// fn(data, ptr, len)
+ ///
+ /// takes `Bytes` to value
+ pub to_vec: unsafe fn(&AtomicPtr<()>, *const u8, usize) -> Vec<u8>,
+ /// fn(data, ptr, len)
pub drop: unsafe fn(&mut AtomicPtr<()>, *const u8, usize),
}
@@ -55,6 +69,7 @@ mod tests {
const STATIC_VTABLE: Vtable = Vtable {
clone: static_clone,
drop: static_drop,
+ to_vec: static_to_vec,
};
unsafe fn static_clone(
@@ -65,6 +80,15 @@ mod tests {
from_static(std::slice::from_raw_parts(ptr, len)).into()
}
+ unsafe fn static_to_vec(
+ _: &AtomicPtr<()>,
+ ptr: *const u8,
+ len: usize,
+ ) -> Vec<u8> {
+ let slice = std::slice::from_raw_parts(ptr, len);
+ slice.to_vec()
+ }
+
unsafe fn static_drop(_: &mut AtomicPtr<()>, _: *const u8, _: usize) {
// nothing to drop for &'static [u8]
}