diff options
author | Leo K <crowlkats@toaxl.com> | 2021-08-09 10:39:00 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-09 10:39:00 +0200 |
commit | 16ae4a0d5799c9a4ed776f32929f73b1063ae4e8 (patch) | |
tree | ed5d0def5e0acbf67f2c64ac4664b1af46f4c468 /core/bindings.rs | |
parent | 02c74fb70970fcadb7d1e6dab857eeb2cea20e09 (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.rs | 12 |
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 { |