summaryrefslogtreecommitdiff
path: root/serde_v8
diff options
context:
space:
mode:
authorDivy Srivastava <dj.srivastava23@gmail.com>2022-04-22 16:19:08 +0530
committerGitHub <noreply@github.com>2022-04-22 16:19:08 +0530
commit57f7e07c13a1a692602022af4fc32c6ac352bb72 (patch)
treee2b6bf271ebda2aecf158b25c9d6c466461549dd /serde_v8
parent2724235ec798f1fbf8fb5bd291615987ac4b919e (diff)
Reland "perf(http): optimize ReadableStreams backed by a resource" (#14346)
Diffstat (limited to 'serde_v8')
-rw-r--r--serde_v8/magic/buffer.rs20
1 files changed, 20 insertions, 0 deletions
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<Option<Box<[u8]>>>),
+ // Variant of the MagicBuffer than is never exposed to the JS.
+ // Generally used to pass Vec<u8> backed buffers to resource methods.
+ Temp(Vec<u8>),
}
+
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<u8>) -> Self {
+ MagicBuffer::Temp(vec)
+ }
+
+ // TODO(@littledivy): Temporary, this needs a refactor.
+ pub fn to_temp(self) -> Vec<u8> {
+ 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"),
};