summaryrefslogtreecommitdiff
path: root/serde_v8/src/de.rs
diff options
context:
space:
mode:
authorAaron O'Mullan <aaron.omullan@gmail.com>2022-01-20 15:11:09 +0100
committerGitHub <noreply@github.com>2022-01-20 15:11:09 +0100
commit1cc38f5155bdc5605d74cd959660fa04f782ac63 (patch)
tree24c435bf3bdb0603625da3286f6133761b5073b5 /serde_v8/src/de.rs
parent443d8fc41cab405dbdd967ef7eb86f520517280f (diff)
feat(serde_v8): deserialize ArrayBuffers (#13436)
Previously we would only deserialize `ArrayBufferView`s as zero-copy bufs This avoids rewrapping `ArrayBuffers` in `ArrayBufferView`s when implementing APIs that take [BufferSource](https://webidl.spec.whatwg.org/#BufferSource) args passed through the op-layer
Diffstat (limited to 'serde_v8/src/de.rs')
-rw-r--r--serde_v8/src/de.rs33
1 files changed, 26 insertions, 7 deletions
diff --git a/serde_v8/src/de.rs b/serde_v8/src/de.rs
index 69e618cb3..2deb5da39 100644
--- a/serde_v8/src/de.rs
+++ b/serde_v8/src/de.rs
@@ -134,9 +134,20 @@ impl<'de, 'a, 'b, 's, 'x> de::Deserializer<'de>
ValueType::ArrayBufferView => {
v8::Local::<v8::ArrayBufferView>::try_from(self.input)
.and_then(|view| {
- magic::zero_copy_buf::ZeroCopyBuf::try_new(self.scope, view)
+ magic::zero_copy_buf::ZeroCopyBuf::try_from((
+ &mut *self.scope,
+ view,
+ ))
})
- .map_err(|_| Error::ExpectedInteger)
+ .map_err(|_| Error::ExpectedBuffer)
+ .and_then(|zb| visitor.visit_byte_buf(Vec::from(&*zb)))
+ }
+ ValueType::ArrayBuffer => {
+ v8::Local::<v8::ArrayBuffer>::try_from(self.input)
+ .and_then(|buffer| {
+ magic::zero_copy_buf::ZeroCopyBuf::try_from(buffer)
+ })
+ .map_err(|_| Error::ExpectedBuffer)
.and_then(|zb| visitor.visit_byte_buf(Vec::from(&*zb)))
}
}
@@ -339,12 +350,20 @@ impl<'de, 'a, 'b, 's, 'x> de::Deserializer<'de>
// Magic Buffer
if name == magic::buffer::BUF_NAME {
- let zero_copy_buf =
- v8::Local::<v8::ArrayBufferView>::try_from(self.input)
+ let zero_copy_buf = match self.input.is_array_buffer() {
+ // ArrayBuffer
+ true => v8::Local::<v8::ArrayBuffer>::try_from(self.input)
+ .and_then(magic::zero_copy_buf::ZeroCopyBuf::try_from),
+ // maybe ArrayBufferView
+ false => v8::Local::<v8::ArrayBufferView>::try_from(self.input)
.and_then(|view| {
- magic::zero_copy_buf::ZeroCopyBuf::try_new(self.scope, view)
- })
- .map_err(|_| Error::ExpectedArray)?;
+ magic::zero_copy_buf::ZeroCopyBuf::try_from((
+ &mut *self.scope,
+ view,
+ ))
+ }),
+ }
+ .map_err(|_| Error::ExpectedBuffer)?;
let data: [u8; 32] = unsafe { std::mem::transmute(zero_copy_buf) };
return visitor.visit_bytes(&data);
}