diff options
author | Matt Mastracci <matthew@mastracci.com> | 2023-07-01 18:00:14 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-02 00:00:14 +0000 |
commit | e746b6d80654ba4e4e26370fe6e4f784ce841d92 (patch) | |
tree | 153ffad92a96126b9ab8e906dcdabf7648755931 /serde_v8/magic/rawbytes.rs | |
parent | b9c0e7cd550ab14fa7da7e33ed87cbeeeb9785a0 (diff) |
refactor(core): Extract deno_core (#19658)
`deno_core` is moving out! You'll find it at
https://github.com/denoland/deno_core/ once this PR lands.
Diffstat (limited to 'serde_v8/magic/rawbytes.rs')
-rw-r--r-- | serde_v8/magic/rawbytes.rs | 122 |
1 files changed, 0 insertions, 122 deletions
diff --git a/serde_v8/magic/rawbytes.rs b/serde_v8/magic/rawbytes.rs deleted file mode 100644 index 2703c7756..000000000 --- a/serde_v8/magic/rawbytes.rs +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. -pub(crate) type AtomicPtr<T> = *mut T; -#[allow(unused)] -pub(crate) struct RawBytes { - ptr: *const u8, - len: usize, - // inlined "trait object" - data: AtomicPtr<()>, - vtable: &'static Vtable, -} - -impl RawBytes { - pub fn new_raw( - ptr: *const u8, - len: usize, - data: AtomicPtr<()>, - vtable: &'static Vtable, - ) -> bytes::Bytes { - RawBytes { - ptr, - len, - data, - vtable, - } - .into() - } -} - -// 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), -} - -impl From<RawBytes> for bytes::Bytes { - fn from(b: RawBytes) -> Self { - // SAFETY: RawBytes has the same layout as bytes::Bytes - // this is tested below, both are composed of usize-d ptrs/values - // thus aren't currently subject to rust's field re-ordering to minimize padding - unsafe { std::mem::transmute(b) } - } -} - -#[cfg(test)] -mod tests { - use super::*; - use std::mem; - - const HELLO: &str = "hello"; - - // ===== impl StaticVtable ===== - - const STATIC_VTABLE: Vtable = Vtable { - clone: static_clone, - drop: static_drop, - to_vec: static_to_vec, - }; - - unsafe fn static_clone( - _: &AtomicPtr<()>, - ptr: *const u8, - len: usize, - ) -> bytes::Bytes { - 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] - } - - fn from_static(bytes: &'static [u8]) -> RawBytes { - RawBytes { - ptr: bytes.as_ptr(), - len: bytes.len(), - data: std::ptr::null_mut(), - vtable: &STATIC_VTABLE, - } - } - - #[test] - fn bytes_identity() { - let b1: bytes::Bytes = from_static(HELLO.as_bytes()).into(); - let b2 = bytes::Bytes::from_static(HELLO.as_bytes()); - assert_eq!(b1, b2); // Values are equal - } - - #[test] - fn bytes_layout() { - let u1: [usize; 4] = - // SAFETY: ensuring layout is the same - unsafe { mem::transmute(from_static(HELLO.as_bytes())) }; - let u2: [usize; 4] = - // SAFETY: ensuring layout is the same - unsafe { mem::transmute(bytes::Bytes::from_static(HELLO.as_bytes())) }; - assert_eq!(u1[..3], u2[..3]); // Struct bytes are equal besides Vtables - } -} |