diff options
Diffstat (limited to 'serde_v8/src')
-rw-r--r-- | serde_v8/src/de.rs | 36 | ||||
-rw-r--r-- | serde_v8/src/error.rs | 1 |
2 files changed, 19 insertions, 18 deletions
diff --git a/serde_v8/src/de.rs b/serde_v8/src/de.rs index 2deb5da39..318894c22 100644 --- a/serde_v8/src/de.rs +++ b/serde_v8/src/de.rs @@ -370,25 +370,25 @@ impl<'de, 'a, 'b, 's, 'x> de::Deserializer<'de> // Magic ByteString if name == magic::bytestring::NAME { - if let Some(v8_string) = self.input.to_string(self.scope) { - if v8_string.contains_only_onebyte() { - let mut buffer: Vec<u8> = vec![0u8; v8_string.length()]; - let written = v8_string.write_one_byte( - self.scope, - &mut buffer, - 0, - v8::WriteOptions::NO_NULL_TERMINATION, - ); - assert!(written == v8_string.length()); - return visitor.visit_byte_buf(buffer); - } else { - return Err(Error::Message( - "Expected a valid ByteString.".to_string(), - )); - } - } else { - return Err(Error::ExpectedString); + let v8str = v8::Local::<v8::String>::try_from(self.input) + .map_err(|_| Error::ExpectedString)?; + if !v8str.contains_only_onebyte() { + return Err(Error::ExpectedLatin1); + } + let len = v8str.length(); + let mut buffer = Vec::with_capacity(len); + #[allow(clippy::uninit_vec)] + unsafe { + buffer.set_len(len); } + let written = v8str.write_one_byte( + self.scope, + &mut buffer, + 0, + v8::WriteOptions::NO_NULL_TERMINATION, + ); + assert!(written == len); + return visitor.visit_byte_buf(buffer); } // Regular struct diff --git a/serde_v8/src/error.rs b/serde_v8/src/error.rs index 6f4305536..e4f7f363b 100644 --- a/serde_v8/src/error.rs +++ b/serde_v8/src/error.rs @@ -19,6 +19,7 @@ pub enum Error { ExpectedBuffer, ExpectedUtf8, + ExpectedLatin1, LengthMismatch, } |