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 | |
parent | 02c74fb70970fcadb7d1e6dab857eeb2cea20e09 (diff) |
feat(extensions/web): add structuredClone function (#11572)
Co-authored-by: Luca Casonato <hello@lcas.dev>
Diffstat (limited to 'core')
-rw-r--r-- | core/bindings.rs | 12 | ||||
-rw-r--r-- | core/serialize_deserialize_test.js | 14 |
2 files changed, 19 insertions, 7 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 { diff --git a/core/serialize_deserialize_test.js b/core/serialize_deserialize_test.js index 6368d56db..b71bed0c9 100644 --- a/core/serialize_deserialize_test.js +++ b/core/serialize_deserialize_test.js @@ -19,7 +19,7 @@ function assertArrayEquals(a1, a2) { function main() { const emptyString = ""; - const emptyStringSerialized = [34, 0]; + const emptyStringSerialized = [255, 13, 34, 0]; assertArrayEquals(Deno.core.serialize(emptyString), emptyStringSerialized); assert( Deno.core.deserialize(new Uint8Array(emptyStringSerialized)) === @@ -29,7 +29,7 @@ function main() { const primitiveValueArray = ["test", "a", null, undefined]; // deno-fmt-ignore const primitiveValueArraySerialized = [ - 65, 4, 34, 4, 116, 101, 115, 116, + 255, 13, 65, 4, 34, 4, 116, 101, 115, 116, 34, 1, 97, 48, 95, 36, 0, 4, ]; assertArrayEquals( @@ -48,11 +48,11 @@ function main() { circularObject.test = circularObject; // deno-fmt-ignore const circularObjectSerialized = [ - 111, 34, 4, 116, 101, 115, 116, 94, - 0, 34, 5, 116, 101, 115, 116, 50, - 34, 2, 100, 100, 34, 5, 116, 101, - 115, 116, 51, 34, 2, 97, 97, 123, - 3, + 255, 13, 111, 34, 4, 116, 101, 115, + 116, 94, 0, 34, 5, 116, 101, 115, + 116, 50, 34, 2, 100, 100, 34, 5, + 116, 101, 115, 116, 51, 34, 2, 97, + 97, 123, 3, ]; assertArrayEquals( |