summaryrefslogtreecommitdiff
path: root/serde_v8/src/magic
diff options
context:
space:
mode:
authorAndreu Botella <andreu@andreubotella.com>2022-03-16 00:22:00 +0100
committerGitHub <noreply@github.com>2022-03-16 00:22:00 +0100
commit672f66dde1f7ec87282d37e10cac2cdd36e5f181 (patch)
treeaa662ed245efe575841d0a951d8ce36f53b48ed4 /serde_v8/src/magic
parentbb53135ed87ec063c9238e1b7de8cf3b44535685 (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.rs1
-rw-r--r--serde_v8/src/magic/u16string.rs62
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