diff options
author | Aaron O'Mullan <aaron.omullan@gmail.com> | 2022-04-25 09:56:47 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-25 16:56:47 +0200 |
commit | 12f7581ed9ee5324a425074d30aedd38b89d4838 (patch) | |
tree | 383c8db6b7d760d89473466cf0a46c2fb17e99f9 /serde_v8/magic/zero_copy_buf.rs | |
parent | ddbfa1418c5ec2805a565caa07f7eec6af1deb39 (diff) |
cleanup(serde_v8): disambiguate ZeroCopyBuf (#14380)
Diffstat (limited to 'serde_v8/magic/zero_copy_buf.rs')
-rw-r--r-- | serde_v8/magic/zero_copy_buf.rs | 105 |
1 files changed, 0 insertions, 105 deletions
diff --git a/serde_v8/magic/zero_copy_buf.rs b/serde_v8/magic/zero_copy_buf.rs deleted file mode 100644 index a9dc6334c..000000000 --- a/serde_v8/magic/zero_copy_buf.rs +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license. - -use std::ops::Deref; -use std::ops::DerefMut; -use std::ops::Range; - -use super::transl8::FromV8; - -/// A ZeroCopyBuf encapsulates a slice that's been borrowed from a JavaScript -/// ArrayBuffer object. JavaScript objects can normally be garbage collected, -/// but the existence of a ZeroCopyBuf inhibits this until it is dropped. It -/// behaves much like an Arc<[u8]>. -/// -/// # Cloning -/// Cloning a ZeroCopyBuf does not clone the contents of the buffer, -/// it creates a new reference to that buffer. -/// -/// To actually clone the contents of the buffer do -/// `let copy = Vec::from(&*zero_copy_buf);` -#[derive(Clone)] -pub struct ZeroCopyBuf { - pub(crate) store: v8::SharedRef<v8::BackingStore>, - pub(crate) range: Range<usize>, -} - -unsafe impl Send for ZeroCopyBuf {} - -impl ZeroCopyBuf { - pub fn from_buffer( - buffer: v8::Local<v8::ArrayBuffer>, - range: Range<usize>, - ) -> Result<Self, v8::DataError> { - let store = buffer.get_backing_store(); - if store.is_shared() { - return Err(v8::DataError::BadType { - actual: "shared ArrayBufferView", - expected: "non-shared ArrayBufferView", - }); - } - Ok(Self { store, range }) - } - - fn as_slice(&self) -> &[u8] { - unsafe { &*(&self.store[self.range.clone()] as *const _ as *const [u8]) } - } - - #[allow(clippy::cast_ref_to_mut)] - fn as_slice_mut(&mut self) -> &mut [u8] { - unsafe { &mut *(&self.store[self.range.clone()] as *const _ as *mut [u8]) } - } -} - -pub(crate) fn to_ranged_buffer<'s>( - scope: &mut v8::HandleScope<'s>, - value: v8::Local<v8::Value>, -) -> Result<(v8::Local<'s, v8::ArrayBuffer>, Range<usize>), v8::DataError> { - if value.is_array_buffer_view() { - let view: v8::Local<v8::ArrayBufferView> = value.try_into()?; - let (offset, len) = (view.byte_offset(), view.byte_length()); - let buffer = view.buffer(scope).ok_or(v8::DataError::NoData { - expected: "view to have a buffer", - })?; - let buffer = v8::Local::new(scope, buffer); // recreate handle to avoid lifetime issues - return Ok((buffer, offset..offset + len)); - } - let b: v8::Local<v8::ArrayBuffer> = value.try_into()?; - let b = v8::Local::new(scope, b); // recreate handle to avoid lifetime issues - Ok((b, 0..b.byte_length())) -} - -impl FromV8 for ZeroCopyBuf { - fn from_v8( - scope: &mut v8::HandleScope, - value: v8::Local<v8::Value>, - ) -> Result<Self, crate::Error> { - to_ranged_buffer(scope, value) - .and_then(|(b, r)| Self::from_buffer(b, r)) - .map_err(|_| crate::Error::ExpectedBuffer) - } -} - -impl Deref for ZeroCopyBuf { - type Target = [u8]; - fn deref(&self) -> &[u8] { - self.as_slice() - } -} - -impl DerefMut for ZeroCopyBuf { - fn deref_mut(&mut self) -> &mut [u8] { - self.as_slice_mut() - } -} - -impl AsRef<[u8]> for ZeroCopyBuf { - fn as_ref(&self) -> &[u8] { - self.as_slice() - } -} - -impl AsMut<[u8]> for ZeroCopyBuf { - fn as_mut(&mut self) -> &mut [u8] { - self.as_slice_mut() - } -} |