From 57f7e07c13a1a692602022af4fc32c6ac352bb72 Mon Sep 17 00:00:00 2001 From: Divy Srivastava Date: Fri, 22 Apr 2022 16:19:08 +0530 Subject: Reland "perf(http): optimize ReadableStreams backed by a resource" (#14346) --- serde_v8/magic/buffer.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'serde_v8/magic/buffer.rs') diff --git a/serde_v8/magic/buffer.rs b/serde_v8/magic/buffer.rs index 484984ac5..3a8c9499b 100644 --- a/serde_v8/magic/buffer.rs +++ b/serde_v8/magic/buffer.rs @@ -14,19 +14,36 @@ use crate::magic::transl8::impl_magic; pub enum MagicBuffer { FromV8(ZeroCopyBuf), ToV8(Mutex>>), + // Variant of the MagicBuffer than is never exposed to the JS. + // Generally used to pass Vec backed buffers to resource methods. + Temp(Vec), } + impl_magic!(MagicBuffer); impl MagicBuffer { pub fn empty() -> Self { MagicBuffer::ToV8(Mutex::new(Some(vec![0_u8; 0].into_boxed_slice()))) } + + pub fn new_temp(vec: Vec) -> Self { + MagicBuffer::Temp(vec) + } + + // TODO(@littledivy): Temporary, this needs a refactor. + pub fn to_temp(self) -> Vec { + match self { + MagicBuffer::Temp(vec) => vec, + _ => unreachable!(), + } + } } impl Clone for MagicBuffer { fn clone(&self) -> Self { match self { Self::FromV8(zbuf) => Self::FromV8(zbuf.clone()), + Self::Temp(vec) => Self::Temp(vec.clone()), Self::ToV8(_) => panic!("Don't Clone a MagicBuffer sent to v8"), } } @@ -49,6 +66,7 @@ impl Deref for MagicBuffer { fn deref(&self) -> &[u8] { match self { Self::FromV8(buf) => &*buf, + Self::Temp(vec) => &*vec, Self::ToV8(_) => panic!("Don't Deref a MagicBuffer sent to v8"), } } @@ -58,6 +76,7 @@ impl DerefMut for MagicBuffer { fn deref_mut(&mut self) -> &mut [u8] { match self { Self::FromV8(buf) => &mut *buf, + Self::Temp(vec) => &mut *vec, Self::ToV8(_) => panic!("Don't Deref a MagicBuffer sent to v8"), } } @@ -85,6 +104,7 @@ impl ToV8 for MagicBuffer { let value: &[u8] = buf; value.into() } + Self::Temp(_) => unreachable!(), Self::ToV8(x) => x.lock().unwrap().take().expect("MagicBuffer was empty"), }; -- cgit v1.2.3