summaryrefslogtreecommitdiff
path: root/serde_v8/src
diff options
context:
space:
mode:
authorAaron O'Mullan <aaron.omullan@gmail.com>2022-03-07 11:12:36 +0100
committerGitHub <noreply@github.com>2022-03-07 11:12:36 +0100
commit94c8ecfaaa11906281685fe319ac460758dcd62a (patch)
tree8dc49b7b6761f708ba7bea61409693fba6e059df /serde_v8/src
parentf65529aa67664d7ec90b8fb861686aac3ebc4a56 (diff)
perf(serde_v8): optimize ByteString deserialization (#13853)
Diffstat (limited to 'serde_v8/src')
-rw-r--r--serde_v8/src/de.rs36
-rw-r--r--serde_v8/src/error.rs1
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,
}