diff options
Diffstat (limited to 'serde_v8/magic/v8slice.rs')
-rw-r--r-- | serde_v8/magic/v8slice.rs | 13 |
1 files changed, 13 insertions, 0 deletions
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, |