summaryrefslogtreecommitdiff
path: root/serde_v8/magic/string_or_buffer.rs
diff options
context:
space:
mode:
authorDivy Srivastava <dj.srivastava23@gmail.com>2022-10-20 16:03:57 +0530
committerGitHub <noreply@github.com>2022-10-20 16:03:57 +0530
commitbfc1fb8d68f39b899e544eee66e3a08abfd350b0 (patch)
tree09449913b85f74118f3c7eab0768a5b29f19155b /serde_v8/magic/string_or_buffer.rs
parentd3736f12b5be1879d38e860bb94b975d566b0aa7 (diff)
perf(serde_v8): `serde_v8::StringOrBuffer` return JS ArrayBuffer instead of Uint8Array (#16360)
Towards #16315
Diffstat (limited to 'serde_v8/magic/string_or_buffer.rs')
-rw-r--r--serde_v8/magic/string_or_buffer.rs19
1 files changed, 18 insertions, 1 deletions
diff --git a/serde_v8/magic/string_or_buffer.rs b/serde_v8/magic/string_or_buffer.rs
index aa7e26d2b..582314d4b 100644
--- a/serde_v8/magic/string_or_buffer.rs
+++ b/serde_v8/magic/string_or_buffer.rs
@@ -29,7 +29,24 @@ impl ToV8 for StringOrBuffer {
scope: &mut v8::HandleScope<'a>,
) -> Result<v8::Local<'a, v8::Value>, crate::Error> {
match self {
- Self::Buffer(buf) => crate::to_v8(scope, buf),
+ Self::Buffer(buf) => {
+ let buf: Box<[u8]> = match buf {
+ ZeroCopyBuf::FromV8(buf) => {
+ let value: &[u8] = buf;
+ value.into()
+ }
+ ZeroCopyBuf::Temp(_) => unreachable!(),
+ ZeroCopyBuf::ToV8(ref mut x) => {
+ x.take().expect("ZeroCopyBuf was empty")
+ }
+ };
+ let backing_store =
+ v8::ArrayBuffer::new_backing_store_from_boxed_slice(buf);
+ Ok(
+ v8::ArrayBuffer::with_backing_store(scope, &backing_store.into())
+ .into(),
+ )
+ }
Self::String(s) => crate::to_v8(scope, s),
}
}