summaryrefslogtreecommitdiff
path: root/serde_v8
diff options
context:
space:
mode:
Diffstat (limited to 'serde_v8')
-rw-r--r--serde_v8/Cargo.toml2
-rw-r--r--serde_v8/magic/rawbytes.rs24
-rw-r--r--serde_v8/magic/v8slice.rs13
3 files changed, 38 insertions, 1 deletions
diff --git a/serde_v8/Cargo.toml b/serde_v8/Cargo.toml
index 3dc05912c..dba85b240 100644
--- a/serde_v8/Cargo.toml
+++ b/serde_v8/Cargo.toml
@@ -13,7 +13,7 @@ description = "Rust to V8 serialization and deserialization"
path = "lib.rs"
[dependencies]
-bytes = "1"
+bytes = "=1.2.1"
derive_more = "0.99.17"
serde = { version = "1.0.136", features = ["derive"] }
serde_bytes = "0.11"
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]
}
diff --git a/serde_v8/magic/v8slice.rs b/serde_v8/magic/v8slice.rs
index 4772abd42..a1c01b888 100644
--- a/serde_v8/magic/v8slice.rs
+++ b/serde_v8/magic/v8slice.rs
@@ -146,6 +146,7 @@ impl From<V8Slice> for bytes::Bytes {
const V8SLICE_VTABLE: rawbytes::Vtable = rawbytes::Vtable {
clone: v8slice_clone,
drop: v8slice_drop,
+ to_vec: v8slice_to_vec,
};
unsafe fn v8slice_clone(
@@ -161,6 +162,18 @@ unsafe fn v8slice_clone(
rawbytes::RawBytes::new_raw(ptr, len, data.cast(), &V8SLICE_VTABLE)
}
+unsafe fn v8slice_to_vec(
+ data: &rawbytes::AtomicPtr<()>,
+ ptr: *const u8,
+ len: usize,
+) -> Vec<u8> {
+ let rc = Rc::from_raw(*data as *const V8Slice);
+ std::mem::forget(rc);
+ // NOTE: `bytes::Bytes` does bounds checking so we trust its ptr, len inputs
+ // and must use them to allow cloning Bytes it has sliced
+ Vec::from_raw_parts(ptr as _, len, len)
+}
+
unsafe fn v8slice_drop(
data: &mut rawbytes::AtomicPtr<()>,
_: *const u8,