From 672f66dde1f7ec87282d37e10cac2cdd36e5f181 Mon Sep 17 00:00:00 2001 From: Andreu Botella Date: Wed, 16 Mar 2022 00:22:00 +0100 Subject: perf(web): Optimize `TextDecoder` by adding a new `U16String` type (#13923) --- serde_v8/src/magic/mod.rs | 1 + serde_v8/src/magic/u16string.rs | 62 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 serde_v8/src/magic/u16string.rs (limited to 'serde_v8/src/magic') diff --git a/serde_v8/src/magic/mod.rs b/serde_v8/src/magic/mod.rs index 941a69d41..e90b5ab60 100644 --- a/serde_v8/src/magic/mod.rs +++ b/serde_v8/src/magic/mod.rs @@ -3,6 +3,7 @@ pub mod buffer; pub mod bytestring; mod field; pub mod string_or_buffer; +pub mod u16string; mod value; pub mod zero_copy_buf; diff --git a/serde_v8/src/magic/u16string.rs b/serde_v8/src/magic/u16string.rs new file mode 100644 index 000000000..a75af016b --- /dev/null +++ b/serde_v8/src/magic/u16string.rs @@ -0,0 +1,62 @@ +use std::ops::{Deref, DerefMut}; + +use serde::Serialize; + +pub const NAME: &str = "$__v8_magic_u16string"; +pub const FIELD_PTR: &str = "$__v8_magic_u16string_ptr"; +pub const FIELD_LEN: &str = "$__v8_magic_u16string_len"; + +#[derive(Default, PartialEq, Eq)] +pub struct U16String(pub Vec); + +impl U16String { + pub fn with_zeroes(length: usize) -> U16String { + U16String(vec![0u16; length]) + } + + pub fn truncate(&mut self, new_length: usize) { + self.0.truncate(new_length); + self.0.shrink_to_fit() + } +} + +impl Deref for U16String { + type Target = [u16]; + fn deref(&self) -> &[u16] { + self.0.deref() + } +} + +impl DerefMut for U16String { + fn deref_mut(&mut self) -> &mut [u16] { + self.0.deref_mut() + } +} + +impl AsRef<[u16]> for U16String { + fn as_ref(&self) -> &[u16] { + self.0.as_ref() + } +} + +impl AsMut<[u16]> for U16String { + fn as_mut(&mut self) -> &mut [u16] { + self.0.as_mut() + } +} + +impl Serialize for U16String { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + + let mut s = serializer.serialize_struct(NAME, 3)?; + s.serialize_field(FIELD_PTR, &(self.0.as_ptr() as usize))?; + s.serialize_field(FIELD_LEN, &self.0.len())?; + s.end() + } +} + +// TODO: Deserialize -- cgit v1.2.3