summaryrefslogtreecommitdiff
path: root/serde_v8/src/de.rs
diff options
context:
space:
mode:
authorAaron O'Mullan <aaron.omullan@gmail.com>2021-04-30 14:42:09 +0200
committerGitHub <noreply@github.com>2021-04-30 08:42:09 -0400
commit4e6790a5fadff58d941916a90b78b43d9ab877aa (patch)
tree5e994c85f0d076b9fab743c9237b5b997fe27a58 /serde_v8/src/de.rs
parent8922639c1dc48a8b1ed6910bfe62306d9178d70b (diff)
feat(serde_v8): ZeroCopyBuf (#10432)
Bidirectional zero-copy serialization of buffers between v8 & rust that can be nested in structs/tuples/etc.
Diffstat (limited to 'serde_v8/src/de.rs')
-rw-r--r--serde_v8/src/de.rs10
1 files changed, 10 insertions, 0 deletions
diff --git a/serde_v8/src/de.rs b/serde_v8/src/de.rs
index 4de2f5817..f351d7870 100644
--- a/serde_v8/src/de.rs
+++ b/serde_v8/src/de.rs
@@ -309,6 +309,16 @@ impl<'de, 'a, 'b, 's, 'x> de::Deserializer<'de>
return visitor.visit_u64(hack);
}
+ // Magic Buffer
+ if name == magic::buffer::BUF_NAME {
+ let zero_copy_buf =
+ v8::Local::<v8::ArrayBufferView>::try_from(self.input)
+ .map(|view| magic::zero_copy_buf::ZeroCopyBuf::new(self.scope, view))
+ .map_err(|_| Error::ExpectedArray)?;
+ let data: [u8; 32] = unsafe { std::mem::transmute(zero_copy_buf) };
+ return visitor.visit_bytes(&data);
+ }
+
// Regular struct
let obj = v8::Local::<v8::Object>::try_from(self.input).unwrap();
let map = ObjectAccess {