From 19d0e6b6710a61e6fdcf9f08e6057e49b349fe18 Mon Sep 17 00:00:00 2001 From: Aaron O'Mullan Date: Sun, 4 Apr 2021 01:17:02 +0200 Subject: perf(serde_v8): introduce Serializable boxable object (#9983) --- serde_v8/src/lib.rs | 2 ++ serde_v8/src/serializable.rs | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 serde_v8/src/serializable.rs (limited to 'serde_v8') diff --git a/serde_v8/src/lib.rs b/serde_v8/src/lib.rs index 9413791bb..bd4b00b32 100644 --- a/serde_v8/src/lib.rs +++ b/serde_v8/src/lib.rs @@ -5,6 +5,7 @@ mod keys; mod magic; mod payload; mod ser; +mod serializable; pub mod utils; pub use de::{from_v8, from_v8_cached, Deserializer}; @@ -12,3 +13,4 @@ pub use error::{Error, Result}; pub use keys::KeyCache; pub use magic::Value; pub use ser::{to_v8, Serializer}; +pub use serializable::Serializable; diff --git a/serde_v8/src/serializable.rs b/serde_v8/src/serializable.rs new file mode 100644 index 000000000..2e781340b --- /dev/null +++ b/serde_v8/src/serializable.rs @@ -0,0 +1,22 @@ +use rusty_v8 as v8; + +/// Serializable exists to allow boxing values as "objects" to be serialized later, +/// this is particularly useful for async op-responses. This trait is a more efficient +/// replacement for erased-serde that makes less allocations, since it's specific to serde_v8 +/// (and thus doesn't have to have generic outputs, etc...) +pub trait Serializable { + fn to_v8<'a>( + &self, + scope: &mut v8::HandleScope<'a>, + ) -> Result, crate::Error>; +} + +/// Allows all implementors of `serde::Serialize` to implement Serializable +impl Serializable for T { + fn to_v8<'a>( + &self, + scope: &mut v8::HandleScope<'a>, + ) -> Result, crate::Error> { + crate::to_v8(scope, self) + } +} -- cgit v1.2.3