diff options
author | Andreu Botella <andreu@andreubotella.com> | 2022-03-16 00:22:00 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-16 00:22:00 +0100 |
commit | 672f66dde1f7ec87282d37e10cac2cdd36e5f181 (patch) | |
tree | aa662ed245efe575841d0a951d8ce36f53b48ed4 /serde_v8/src/magic | |
parent | bb53135ed87ec063c9238e1b7de8cf3b44535685 (diff) |
perf(web): Optimize `TextDecoder` by adding a new `U16String` type (#13923)
Diffstat (limited to 'serde_v8/src/magic')
-rw-r--r-- | serde_v8/src/magic/mod.rs | 1 | ||||
-rw-r--r-- | serde_v8/src/magic/u16string.rs | 62 |
2 files changed, 63 insertions, 0 deletions
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<u16>); + +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<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + 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 |