Index: src/value-serializer.cc |
diff --git a/src/value-serializer.cc b/src/value-serializer.cc |
index 880dc8046d7a7f2111b72c146c0193ef03ec0bf4..29ebb8f1508ff4af7562803cbe1e454c2255bdcd 100644 |
--- a/src/value-serializer.cc |
+++ b/src/value-serializer.cc |
@@ -717,10 +717,10 @@ 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()); |
+static Maybe<bool> SetPropertiesFromKeyValuePairs(Isolate* isolate, |
+ Handle<JSObject> object, |
+ Handle<Object>* data, |
+ uint32_t num_properties) { |
for (unsigned i = 0; i < 2 * num_properties; i += 2) { |
Handle<Object> key = data[i]; |
Handle<Object> value = data[i + 1]; |
@@ -730,10 +730,10 @@ static MaybeHandle<JSObject> CreateJSObjectFromKeyValuePairs( |
if (!success || |
JSObject::DefineOwnPropertyIgnoreAttributes(&it, value, NONE) |
.is_null()) { |
- return MaybeHandle<JSObject>(); |
+ return Nothing<bool>(); |
} |
} |
- return object; |
+ return Just(true); |
} |
MaybeHandle<Object> |
@@ -759,17 +759,51 @@ ValueDeserializer::ReadObjectUsingEntireBufferForLegacyFormat() { |
return MaybeHandle<Object>(); |
} |
- 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)) { |
+ size_t begin_properties = |
+ stack.size() - 2 * static_cast<size_t>(num_properties); |
+ Handle<JSObject> js_object = |
+ isolate_->factory()->NewJSObject(isolate_->object_function()); |
+ if (num_properties && |
+ !SetPropertiesFromKeyValuePairs( |
+ isolate_, js_object, &stack[begin_properties], num_properties) |
+ .FromMaybe(false)) { |
+ return MaybeHandle<Object>(); |
+ } |
+ |
+ stack.resize(begin_properties); |
+ new_object = js_object; |
+ break; |
+ } |
+ case SerializationTag::kEndSparseJSArray: { |
+ ConsumeTag(SerializationTag::kEndSparseJSArray); |
+ |
+ // Sparse JS Array: Read the last 2*|num_properties| from the stack. |
+ uint32_t num_properties; |
+ uint32_t length; |
+ if (!ReadVarint<uint32_t>().To(&num_properties) || |
+ !ReadVarint<uint32_t>().To(&length) || |
+ stack.size() / 2 < num_properties) { |
+ return MaybeHandle<Object>(); |
+ } |
+ |
+ Handle<JSArray> js_array = isolate_->factory()->NewJSArray(0); |
+ JSArray::SetLength(js_array, length); |
+ size_t begin_properties = |
+ stack.size() - 2 * static_cast<size_t>(num_properties); |
+ if (num_properties && |
+ !SetPropertiesFromKeyValuePairs( |
+ isolate_, js_array, &stack[begin_properties], num_properties) |
+ .FromMaybe(false)) { |
return MaybeHandle<Object>(); |
} |
stack.resize(begin_properties); |
+ new_object = js_array; |
break; |
} |
+ case SerializationTag::kEndDenseJSArray: |
+ // This was already broken in Chromium, and apparently wasn't missed. |
+ return MaybeHandle<Object>(); |
default: |
if (!ReadObject().ToHandle(&new_object)) return MaybeHandle<Object>(); |
break; |