diff options
Diffstat (limited to 'serde_v8/src')
-rw-r--r-- | serde_v8/src/magic/buffer.rs | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/serde_v8/src/magic/buffer.rs b/serde_v8/src/magic/buffer.rs index 893bf35e1..1fcfffc72 100644 --- a/serde_v8/src/magic/buffer.rs +++ b/serde_v8/src/magic/buffer.rs @@ -1,9 +1,9 @@ use rusty_v8 as v8; -use std::cell::Cell; use std::fmt; use std::ops::Deref; use std::ops::DerefMut; +use std::sync::Mutex; use super::zero_copy_buf::ZeroCopyBuf; @@ -11,7 +11,7 @@ use super::zero_copy_buf::ZeroCopyBuf; // allowing us to use a single type for familiarity pub enum MagicBuffer { FromV8(ZeroCopyBuf), - ToV8(Cell<Option<Box<[u8]>>>), + ToV8(Mutex<Option<Box<[u8]>>>), } impl MagicBuffer { @@ -21,6 +21,10 @@ impl MagicBuffer { ) -> Self { Self::FromV8(ZeroCopyBuf::new(scope, view)) } + + pub fn empty() -> Self { + MagicBuffer::ToV8(Mutex::new(Some(vec![0_u8; 0].into_boxed_slice()))) + } } impl Clone for MagicBuffer { @@ -65,7 +69,7 @@ impl DerefMut for MagicBuffer { impl From<Box<[u8]>> for MagicBuffer { fn from(buf: Box<[u8]>) -> Self { - MagicBuffer::ToV8(Cell::new(Some(buf))) + MagicBuffer::ToV8(Mutex::new(Some(buf))) } } @@ -88,8 +92,11 @@ impl serde::Serialize for MagicBuffer { let mut s = serializer.serialize_struct(BUF_NAME, 1)?; let boxed: Box<[u8]> = match self { - Self::FromV8(_) => unreachable!(), - Self::ToV8(x) => x.take().expect("MagicBuffer was empty"), + Self::FromV8(buf) => { + let value: &[u8] = &buf; + value.into() + } + Self::ToV8(x) => x.lock().unwrap().take().expect("MagicBuffer was empty"), }; let hack: [usize; 2] = unsafe { std::mem::transmute(boxed) }; let f1: u64 = hack[0] as u64; |