summaryrefslogtreecommitdiff
path: root/core/bindings.rs
diff options
context:
space:
mode:
authorLeo K <crowlkats@toaxl.com>2021-08-09 10:39:00 +0200
committerGitHub <noreply@github.com>2021-08-09 10:39:00 +0200
commit16ae4a0d5799c9a4ed776f32929f73b1063ae4e8 (patch)
treeed5d0def5e0acbf67f2c64ac4664b1af46f4c468 /core/bindings.rs
parent02c74fb70970fcadb7d1e6dab857eeb2cea20e09 (diff)
feat(extensions/web): add structuredClone function (#11572)
Co-authored-by: Luca Casonato <hello@lcas.dev>
Diffstat (limited to 'core/bindings.rs')
-rw-r--r--core/bindings.rs12
1 files changed, 12 insertions, 0 deletions
diff --git a/core/bindings.rs b/core/bindings.rs
index af8560c6a..935397480 100644
--- a/core/bindings.rs
+++ b/core/bindings.rs
@@ -26,6 +26,8 @@ use v8::HandleScope;
use v8::Local;
use v8::MapFnTo;
use v8::SharedArrayBuffer;
+use v8::ValueDeserializerHelper;
+use v8::ValueSerializerHelper;
lazy_static::lazy_static! {
pub static ref EXTERNAL_REFERENCES: v8::ExternalReferences =
@@ -827,6 +829,7 @@ fn serialize(
let serialize_deserialize = Box::new(SerializeDeserialize { host_objects });
let mut value_serializer =
v8::ValueSerializer::new(scope, serialize_deserialize);
+ value_serializer.write_header();
match value_serializer.write_value(scope.get_current_context(), value) {
Some(true) => {
let vector = value_serializer.release();
@@ -884,6 +887,15 @@ fn deserialize(
let serialize_deserialize = Box::new(SerializeDeserialize { host_objects });
let mut value_deserializer =
v8::ValueDeserializer::new(scope, serialize_deserialize, &zero_copy);
+ let parsed_header = value_deserializer
+ .read_header(scope.get_current_context())
+ .unwrap_or_default();
+ if !parsed_header {
+ let msg = v8::String::new(scope, "could not deserialize value").unwrap();
+ let exception = v8::Exception::range_error(scope, msg);
+ scope.throw_exception(exception);
+ return;
+ }
let value = value_deserializer.read_value(scope.get_current_context());
match value {