summaryrefslogtreecommitdiff
path: root/serde_v8/src/de.rs
diff options
context:
space:
mode:
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);
}