diff options
author | Aaron O'Mullan <aaron.omullan@gmail.com> | 2021-04-30 14:42:09 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-30 08:42:09 -0400 |
commit | 4e6790a5fadff58d941916a90b78b43d9ab877aa (patch) | |
tree | 5e994c85f0d076b9fab743c9237b5b997fe27a58 /serde_v8/src/de.rs | |
parent | 8922639c1dc48a8b1ed6910bfe62306d9178d70b (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.rs | 10 |
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 { |