Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(455)

Side by Side Diff: src/value-serializer.h

Issue 2275033003: Blink-compatible serialization of ArrayBuffer transfer. (Closed)
Patch Set: Accepts Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/api.cc ('k') | src/value-serializer.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 the V8 project authors. All rights reserved. 1 // Copyright 2016 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_VALUE_SERIALIZER_H_ 5 #ifndef V8_VALUE_SERIALIZER_H_
6 #define V8_VALUE_SERIALIZER_H_ 6 #define V8_VALUE_SERIALIZER_H_
7 7
8 #include <cstdint> 8 #include <cstdint>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 * Serializes a V8 object into the buffer. 52 * Serializes a V8 object into the buffer.
53 */ 53 */
54 Maybe<bool> WriteObject(Handle<Object> object) WARN_UNUSED_RESULT; 54 Maybe<bool> WriteObject(Handle<Object> object) WARN_UNUSED_RESULT;
55 55
56 /* 56 /*
57 * Returns the stored data. This serializer should not be used once the buffer 57 * Returns the stored data. This serializer should not be used once the buffer
58 * is released. The contents are undefined if a previous write has failed. 58 * is released. The contents are undefined if a previous write has failed.
59 */ 59 */
60 std::vector<uint8_t> ReleaseBuffer() { return std::move(buffer_); } 60 std::vector<uint8_t> ReleaseBuffer() { return std::move(buffer_); }
61 61
62 /*
63 * Marks an ArrayBuffer as havings its contents transferred out of band.
64 * Pass the corresponding JSArrayBuffer in the deserializing context to
65 * ValueDeserializer::TransferArrayBuffer.
66 */
67 void TransferArrayBuffer(uint32_t transfer_id,
68 Handle<JSArrayBuffer> array_buffer);
69
62 private: 70 private:
63 // Writing the wire format. 71 // Writing the wire format.
64 void WriteTag(SerializationTag tag); 72 void WriteTag(SerializationTag tag);
65 template <typename T> 73 template <typename T>
66 void WriteVarint(T value); 74 void WriteVarint(T value);
67 template <typename T> 75 template <typename T>
68 void WriteZigZag(T value); 76 void WriteZigZag(T value);
69 void WriteDouble(double value); 77 void WriteDouble(double value);
70 void WriteOneByteString(Vector<const uint8_t> chars); 78 void WriteOneByteString(Vector<const uint8_t> chars);
71 void WriteTwoByteString(Vector<const uc16> chars); 79 void WriteTwoByteString(Vector<const uc16> chars);
(...skipping 26 matching lines...) Expand all
98 Isolate* const isolate_; 106 Isolate* const isolate_;
99 std::vector<uint8_t> buffer_; 107 std::vector<uint8_t> buffer_;
100 Zone zone_; 108 Zone zone_;
101 109
102 // To avoid extra lookups in the identity map, ID+1 is actually stored in the 110 // To avoid extra lookups in the identity map, ID+1 is actually stored in the
103 // map (checking if the used identity is zero is the fast way of checking if 111 // map (checking if the used identity is zero is the fast way of checking if
104 // the entry is new). 112 // the entry is new).
105 IdentityMap<uint32_t> id_map_; 113 IdentityMap<uint32_t> id_map_;
106 uint32_t next_id_ = 0; 114 uint32_t next_id_ = 0;
107 115
116 // A similar map, for transferred array buffers.
117 IdentityMap<uint32_t> array_buffer_transfer_map_;
118
108 DISALLOW_COPY_AND_ASSIGN(ValueSerializer); 119 DISALLOW_COPY_AND_ASSIGN(ValueSerializer);
109 }; 120 };
110 121
111 /* 122 /*
112 * Deserializes values from data written with ValueSerializer, or a compatible 123 * Deserializes values from data written with ValueSerializer, or a compatible
113 * implementation. 124 * implementation.
114 */ 125 */
115 class ValueDeserializer { 126 class ValueDeserializer {
116 public: 127 public:
117 ValueDeserializer(Isolate* isolate, Vector<const uint8_t> data); 128 ValueDeserializer(Isolate* isolate, Vector<const uint8_t> data);
(...skipping 19 matching lines...) Expand all
137 /* 148 /*
138 * Reads an object, consuming the entire buffer. 149 * Reads an object, consuming the entire buffer.
139 * 150 *
140 * This is required for the legacy "version 0" format, which did not allow 151 * This is required for the legacy "version 0" format, which did not allow
141 * reference deduplication, and instead relied on a "stack" model for 152 * reference deduplication, and instead relied on a "stack" model for
142 * deserializing, with the contents of objects and arrays provided first. 153 * deserializing, with the contents of objects and arrays provided first.
143 */ 154 */
144 MaybeHandle<Object> ReadObjectUsingEntireBufferForLegacyFormat() 155 MaybeHandle<Object> ReadObjectUsingEntireBufferForLegacyFormat()
145 WARN_UNUSED_RESULT; 156 WARN_UNUSED_RESULT;
146 157
158 /*
159 * Accepts the array buffer corresponding to the one passed previously to
160 * ValueSerializer::TransferArrayBuffer.
161 */
162 void TransferArrayBuffer(uint32_t transfer_id,
163 Handle<JSArrayBuffer> array_buffer);
164
147 private: 165 private:
148 // Reading the wire format. 166 // Reading the wire format.
149 Maybe<SerializationTag> PeekTag() const WARN_UNUSED_RESULT; 167 Maybe<SerializationTag> PeekTag() const WARN_UNUSED_RESULT;
150 void ConsumeTag(SerializationTag peeked_tag); 168 void ConsumeTag(SerializationTag peeked_tag);
151 Maybe<SerializationTag> ReadTag() WARN_UNUSED_RESULT; 169 Maybe<SerializationTag> ReadTag() WARN_UNUSED_RESULT;
152 template <typename T> 170 template <typename T>
153 Maybe<T> ReadVarint() WARN_UNUSED_RESULT; 171 Maybe<T> ReadVarint() WARN_UNUSED_RESULT;
154 template <typename T> 172 template <typename T>
155 Maybe<T> ReadZigZag() WARN_UNUSED_RESULT; 173 Maybe<T> ReadZigZag() WARN_UNUSED_RESULT;
156 Maybe<double> ReadDouble() WARN_UNUSED_RESULT; 174 Maybe<double> ReadDouble() WARN_UNUSED_RESULT;
157 Maybe<Vector<const uint8_t>> ReadRawBytes(int size) WARN_UNUSED_RESULT; 175 Maybe<Vector<const uint8_t>> ReadRawBytes(int size) WARN_UNUSED_RESULT;
158 176
159 // Reading V8 objects of specific kinds. 177 // Reading V8 objects of specific kinds.
160 // The tag is assumed to have already been read. 178 // The tag is assumed to have already been read.
161 MaybeHandle<String> ReadUtf8String() WARN_UNUSED_RESULT; 179 MaybeHandle<String> ReadUtf8String() WARN_UNUSED_RESULT;
162 MaybeHandle<String> ReadTwoByteString() WARN_UNUSED_RESULT; 180 MaybeHandle<String> ReadTwoByteString() WARN_UNUSED_RESULT;
163 MaybeHandle<JSObject> ReadJSObject() WARN_UNUSED_RESULT; 181 MaybeHandle<JSObject> ReadJSObject() WARN_UNUSED_RESULT;
164 MaybeHandle<JSArray> ReadSparseJSArray() WARN_UNUSED_RESULT; 182 MaybeHandle<JSArray> ReadSparseJSArray() WARN_UNUSED_RESULT;
165 MaybeHandle<JSArray> ReadDenseJSArray() WARN_UNUSED_RESULT; 183 MaybeHandle<JSArray> ReadDenseJSArray() WARN_UNUSED_RESULT;
166 MaybeHandle<JSDate> ReadJSDate() WARN_UNUSED_RESULT; 184 MaybeHandle<JSDate> ReadJSDate() WARN_UNUSED_RESULT;
167 MaybeHandle<JSValue> ReadJSValue(SerializationTag tag) WARN_UNUSED_RESULT; 185 MaybeHandle<JSValue> ReadJSValue(SerializationTag tag) WARN_UNUSED_RESULT;
168 MaybeHandle<JSRegExp> ReadJSRegExp() WARN_UNUSED_RESULT; 186 MaybeHandle<JSRegExp> ReadJSRegExp() WARN_UNUSED_RESULT;
169 MaybeHandle<JSMap> ReadJSMap() WARN_UNUSED_RESULT; 187 MaybeHandle<JSMap> ReadJSMap() WARN_UNUSED_RESULT;
170 MaybeHandle<JSSet> ReadJSSet() WARN_UNUSED_RESULT; 188 MaybeHandle<JSSet> ReadJSSet() WARN_UNUSED_RESULT;
171 MaybeHandle<JSArrayBuffer> ReadJSArrayBuffer() WARN_UNUSED_RESULT; 189 MaybeHandle<JSArrayBuffer> ReadJSArrayBuffer() WARN_UNUSED_RESULT;
190 MaybeHandle<JSArrayBuffer> ReadTransferredJSArrayBuffer() WARN_UNUSED_RESULT;
172 191
173 /* 192 /*
174 * Reads key-value pairs into the object until the specified end tag is 193 * Reads key-value pairs into the object until the specified end tag is
175 * encountered. If successful, returns the number of properties read. 194 * encountered. If successful, returns the number of properties read.
176 */ 195 */
177 Maybe<uint32_t> ReadJSObjectProperties(Handle<JSObject> object, 196 Maybe<uint32_t> ReadJSObjectProperties(Handle<JSObject> object,
178 SerializationTag end_tag); 197 SerializationTag end_tag);
179 198
180 // Manipulating the map from IDs to reified objects. 199 // Manipulating the map from IDs to reified objects.
181 bool HasObjectWithID(uint32_t id); 200 bool HasObjectWithID(uint32_t id);
182 MaybeHandle<JSReceiver> GetObjectWithID(uint32_t id); 201 MaybeHandle<JSReceiver> GetObjectWithID(uint32_t id);
183 void AddObjectWithID(uint32_t id, Handle<JSReceiver> object); 202 void AddObjectWithID(uint32_t id, Handle<JSReceiver> object);
184 203
185 Isolate* const isolate_; 204 Isolate* const isolate_;
186 const uint8_t* position_; 205 const uint8_t* position_;
187 const uint8_t* const end_; 206 const uint8_t* const end_;
188 uint32_t version_ = 0; 207 uint32_t version_ = 0;
189 Handle<SeededNumberDictionary> id_map_; // Always a global handle.
190 uint32_t next_id_ = 0; 208 uint32_t next_id_ = 0;
191 209
210 // Always global handles.
211 Handle<SeededNumberDictionary> id_map_;
212 MaybeHandle<SeededNumberDictionary> array_buffer_transfer_map_;
213
192 DISALLOW_COPY_AND_ASSIGN(ValueDeserializer); 214 DISALLOW_COPY_AND_ASSIGN(ValueDeserializer);
193 }; 215 };
194 216
195 } // namespace internal 217 } // namespace internal
196 } // namespace v8 218 } // namespace v8
197 219
198 #endif // V8_VALUE_SERIALIZER_H_ 220 #endif // V8_VALUE_SERIALIZER_H_
OLDNEW
« no previous file with comments | « src/api.cc ('k') | src/value-serializer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698