Index: src/value-serializer.cc |
diff --git a/src/value-serializer.cc b/src/value-serializer.cc |
index 8e74e91f9652100bc36b196ef9ea2c1c31114384..a6d0c3c2bac7ed620e7de1fd86a61dc05bd944b8 100644 |
--- a/src/value-serializer.cc |
+++ b/src/value-serializer.cc |
@@ -327,6 +327,12 @@ Maybe<SerializationTag> ValueDeserializer::PeekTag() const { |
return Just(tag); |
} |
+void ValueDeserializer::ConsumeTag(SerializationTag peeked_tag) { |
+ SerializationTag actual_tag = ReadTag().ToChecked(); |
+ DCHECK(actual_tag == peeked_tag); |
+ (void)actual_tag; |
Camillo Bruni
2016/08/16 09:04:07
nit: you can use our very pretty USE macro here :)
jbroman
2016/08/16 21:34:14
I was looking for one, but didn't find it. Thanks.
|
+} |
+ |
Maybe<SerializationTag> ValueDeserializer::ReadTag() { |
SerializationTag tag; |
do { |
@@ -512,9 +518,7 @@ Maybe<uint32_t> ValueDeserializer::ReadJSObjectProperties( |
SerializationTag tag; |
if (!PeekTag().To(&tag)) return Nothing<uint32_t>(); |
if (tag == end_tag) { |
- SerializationTag consumed_tag = ReadTag().ToChecked(); |
- (void)consumed_tag; |
- DCHECK(tag == consumed_tag); |
+ ConsumeTag(end_tag); |
return Just(num_properties); |
} |
@@ -561,5 +565,72 @@ void ValueDeserializer::AddObjectWithID(uint32_t id, |
} |
} |
+static MaybeHandle<JSObject> CreateJSObjectFromKeyValuePairs( |
+ Isolate* isolate, Handle<Object>* data, uint32_t num_properties) { |
+ Handle<JSObject> object = |
+ isolate->factory()->NewJSObject(isolate->object_function()); |
Camillo Bruni
2016/08/16 09:04:07
Performance Hint: This is a rather slow (but obvio
jbroman
2016/08/16 21:34:14
No problem. I've learned a lot the last couple wee
|
+ for (unsigned i = 0; i < 2 * num_properties; i += 2) { |
+ Handle<Object> key = data[i]; |
+ Handle<Object> value = data[i + 1]; |
+ bool success; |
+ LookupIterator it = LookupIterator::PropertyOrElement( |
+ isolate, object, key, &success, LookupIterator::OWN); |
+ if (!success || |
+ JSObject::DefineOwnPropertyIgnoreAttributes(&it, value, NONE).is_null()) |
+ return MaybeHandle<JSObject>(); |
Camillo Bruni
2016/08/16 09:04:07
nit: please add braces here, we don't allow traili
jbroman
2016/08/16 21:34:14
OK. As I mentioned in the other review, I couldn't
|
+ } |
+ return object; |
+} |
+ |
+MaybeHandle<Object> |
+ValueDeserializer::ReadObjectUsingEntireBufferForLegacyFormat() { |
+ if (version_ > 0) return MaybeHandle<Object>(); |
+ |
+ HandleScope scope(isolate_); |
+ std::vector<Handle<Object>> stack; |
+ while (position_ < end_) { |
+ SerializationTag tag; |
+ if (!PeekTag().To(&tag)) break; |
+ |
+ Handle<Object> new_object; |
+ switch (tag) { |
+ case SerializationTag::kEndJSObject: { |
+ ConsumeTag(SerializationTag::kEndJSObject); |
+ |
+ // JS Object: Read the last 2*n values from the stack and use them as |
+ // key-value pairs. |
+ uint32_t num_properties; |
+ if (!ReadVarint<uint32_t>().To(&num_properties) || |
+ stack.size() / 2 < num_properties) |
+ return MaybeHandle<Object>(); |
Camillo Bruni
2016/08/16 09:04:07
nit: missing braces
jbroman
2016/08/16 21:34:14
Done.
|
+ |
+ size_t begin_properties = stack.size() - 2 * num_properties; |
+ Handle<Object>* data = |
+ num_properties ? &stack[begin_properties] : nullptr; |
+ if (!CreateJSObjectFromKeyValuePairs(isolate_, data, num_properties) |
+ .ToHandle(&new_object)) |
+ return MaybeHandle<Object>(); |
Camillo Bruni
2016/08/16 09:04:07
nit: braces
jbroman
2016/08/16 21:34:14
Done.
|
+ |
+ stack.resize(begin_properties); |
+ break; |
+ } |
+ default: |
+ if (!ReadObject().ToHandle(&new_object)) return MaybeHandle<Object>(); |
+ break; |
+ } |
+ stack.push_back(new_object); |
+ } |
+ |
+// Nothing remains but padding. |
+#ifdef DEBUG |
+ while (position_ < end_) |
+ DCHECK(*position_++ == static_cast<uint8_t>(SerializationTag::kPadding)); |
Camillo Bruni
2016/08/16 09:04:07
nit: braces
jbroman
2016/08/16 21:34:14
Done.
|
+#endif |
+ position_ = end_; |
+ |
+ if (stack.size() != 1) return MaybeHandle<Object>(); |
+ return scope.CloseAndEscape(stack[0]); |
+} |
+ |
} // namespace internal |
} // namespace v8 |