Skip to content
File

Blob: patches/v8/0002-Allow-manually-setting-ValueSerializer-format-versio.patch

4.1 KB
1From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2From: James M Snell <jasnell@gmail.com>
3Date: Wed, 16 Mar 2022 08:59:21 -0700
4Subject: Allow manually setting ValueSerializer format version
5 
6Refs: https://bitbucket.cfdata.org/projects/MIRRORS/repos/v8/pull-requests/2/overview
7Signed-off-by: James M Snell <jsnell@cloudflare.com>
8 
9diff --git a/include/v8-value-serializer.h b/include/v8-value-serializer.h
10index 40ad805c7970cc9379e69f046205836dbd760373..596be18adeb3a5a81794aaa44b1d347dec6c0c7d 100644
11--- a/include/v8-value-serializer.h
12+++ b/include/v8-value-serializer.h
13@@ -154,6 +154,11 @@ class V8_EXPORT ValueSerializer {
14 ValueSerializer(Isolate* isolate, Delegate* delegate);
15 ~ValueSerializer();
16
17+ /**
18+ * Instruct the ValueSerializer to write at a specific serializer version.
19+ */
20+ Maybe<bool> SetWriteVersion(uint32_t version);
21+
22 /**
23 * Writes out a header, which includes the format version.
24 */
25diff --git a/src/api/api.cc b/src/api/api.cc
26index e98a1d272b663f26e41313f10b99cd564793c5f8..73f38d9a2b25d7420b73f96c34e8aa1764a69223 100644
27--- a/src/api/api.cc
28+++ b/src/api/api.cc
29@@ -3578,6 +3578,10 @@ ValueSerializer::ValueSerializer(Isolate* v8_isolate, Delegate* delegate)
30
31 ValueSerializer::~ValueSerializer() { delete private_; }
32
33+Maybe<bool> ValueSerializer::SetWriteVersion(uint32_t version) {
34+ return private_->serializer.SetWriteVersion(version);
35+}
36+
37 void ValueSerializer::WriteHeader() { private_->serializer.WriteHeader(); }
38
39 void ValueSerializer::SetTreatArrayBufferViewsAsHostObjects(bool mode) {
40diff --git a/src/objects/value-serializer.cc b/src/objects/value-serializer.cc
41index b32852867593bcfd3d0d1b87539d9f904f054aa8..6dc0e13d885aa537a09d580cfc147546cf6fc432 100644
42--- a/src/objects/value-serializer.cc
43+++ b/src/objects/value-serializer.cc
44@@ -298,6 +298,7 @@ ValueSerializer::ValueSerializer(Isolate* isolate,
45 : isolate_(isolate),
46 delegate_(delegate),
47 zone_(isolate->allocator(), ZONE_NAME),
48+ version_(kLatestVersion),
49 id_map_(isolate->heap(), ZoneAllocationPolicy(&zone_)),
50 array_buffer_transfer_map_(isolate->heap(),
51 ZoneAllocationPolicy(&zone_)) {
52@@ -317,9 +318,17 @@ ValueSerializer::~ValueSerializer() {
53 }
54 }
55
56+Maybe<bool> ValueSerializer::SetWriteVersion(uint32_t version) {
57+ if (version < 13 || version > kLatestVersion) {
58+ return ThrowDataCloneError(MessageTemplate::kDataCloneError);
59+ }
60+ version_ = version;
61+ return Just(true);
62+}
63+
64 void ValueSerializer::WriteHeader() {
65 WriteTag(SerializationTag::kVersion);
66- WriteVarint(kLatestVersion);
67+ WriteVarint(version_);
68 }
69
70 void ValueSerializer::SetTreatArrayBufferViewsAsHostObjects(bool mode) {
71@@ -1112,10 +1121,12 @@ Maybe<bool> ValueSerializer::WriteJSArrayBufferView(
72 WriteVarint(static_cast<uint8_t>(tag));
73 WriteVarint(static_cast<uint32_t>(view->byte_offset()));
74 WriteVarint(static_cast<uint32_t>(view->byte_length()));
75- uint32_t flags =
76+ if (version_ >= 14) {
77+ uint32_t flags =
78 JSArrayBufferViewIsLengthTracking::encode(view->is_length_tracking()) |
79 JSArrayBufferViewIsBackedByRab::encode(view->is_backed_by_rab());
80- WriteVarint(flags);
81+ WriteVarint(flags);
82+ }
83 return ThrowIfOutOfMemory();
84 }
85
86diff --git a/src/objects/value-serializer.h b/src/objects/value-serializer.h
87index b84dcc77d4060d13c389b4afed101847c85998da..06475f7b9c2a797066f5cfd32b232e5aa55f1f75 100644
88--- a/src/objects/value-serializer.h
89+++ b/src/objects/value-serializer.h
90@@ -54,6 +54,11 @@ class ValueSerializer {
91 ValueSerializer(const ValueSerializer&) = delete;
92 ValueSerializer& operator=(const ValueSerializer&) = delete;
93
94+ /*
95+ * Instruct the ValueSerializer to write at a specific serializer version.
96+ */
97+ Maybe<bool> SetWriteVersion(uint32_t version);
98+
99 /*
100 * Writes out a header, which includes the format version.
101 */
102@@ -182,6 +187,7 @@ class ValueSerializer {
103 bool treat_array_buffer_views_as_host_objects_ = false;
104 bool out_of_memory_ = false;
105 Zone zone_;
106+ uint32_t version_;
107
108 // To avoid extra lookups in the identity map, ID+1 is actually stored in the
109 // map (checking if the used identity is zero is the fast way of checking if