diff options
author | Aaron O'Mullan <aaron.omullan@gmail.com> | 2022-01-20 15:11:09 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-20 15:11:09 +0100 |
commit | 1cc38f5155bdc5605d74cd959660fa04f782ac63 (patch) | |
tree | 24c435bf3bdb0603625da3286f6133761b5073b5 /serde_v8/src/de.rs | |
parent | 443d8fc41cab405dbdd967ef7eb86f520517280f (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.rs | 33 |
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); } |