| Index: src/value-serializer.cc
|
| diff --git a/src/value-serializer.cc b/src/value-serializer.cc
|
| index 2689fa0bf3e387784e091459c3db159e7db45a3d..ad7492a2a60f32c03ca30b4808fb8954c3f95fb1 100644
|
| --- a/src/value-serializer.cc
|
| +++ b/src/value-serializer.cc
|
| @@ -60,16 +60,6 @@
|
| kBeginJSObject = 'o',
|
| // End of a JS object. numProperties:uint32_t
|
| kEndJSObject = '{',
|
| - // Beginning of a sparse JS array. length:uint32_t
|
| - // Elements and properties are written as key/value pairs, like objects.
|
| - kBeginSparseJSArray = 'a',
|
| - // End of a sparse JS array. numProperties:uint32_t length:uint32_t
|
| - kEndSparseJSArray = '@',
|
| - // Beginning of a dense JS array. length:uint32_t
|
| - // |length| elements, followed by properties as key/value pairs
|
| - kBeginDenseJSArray = 'A',
|
| - // End of a dense JS array. numProperties:uint32_t length:uint32_t
|
| - kEndDenseJSArray = '$',
|
| };
|
|
|
| ValueSerializer::ValueSerializer(Isolate* isolate)
|
| @@ -263,8 +253,6 @@
|
|
|
| HandleScope scope(isolate_);
|
| switch (instance_type) {
|
| - case JS_ARRAY_TYPE:
|
| - return WriteJSArray(Handle<JSArray>::cast(receiver));
|
| case JS_OBJECT_TYPE:
|
| case JS_API_OBJECT_TYPE:
|
| return WriteJSObject(Handle<JSObject>::cast(receiver));
|
| @@ -287,67 +275,6 @@
|
| }
|
| WriteTag(SerializationTag::kEndJSObject);
|
| WriteVarint<uint32_t>(properties_written);
|
| - return Just(true);
|
| -}
|
| -
|
| -Maybe<bool> ValueSerializer::WriteJSArray(Handle<JSArray> array) {
|
| - uint32_t length;
|
| - array->length()->ToArrayLength(&length);
|
| -
|
| - // To keep things simple, for now we decide between dense and sparse
|
| - // serialization based on elements kind. A more principled heuristic could
|
| - // count the elements, but would need to take care to note which indices
|
| - // existed (as only indices which were enumerable own properties at this point
|
| - // should be serialized).
|
| - const bool should_serialize_densely =
|
| - array->HasFastElements() && !array->HasFastHoleyElements();
|
| -
|
| - if (should_serialize_densely) {
|
| - // TODO(jbroman): Distinguish between undefined and a hole (this can happen
|
| - // if serializing one of the elements deletes another). This requires wire
|
| - // format changes.
|
| - WriteTag(SerializationTag::kBeginDenseJSArray);
|
| - WriteVarint<uint32_t>(length);
|
| - for (uint32_t i = 0; i < length; i++) {
|
| - // Serializing the array's elements can have arbitrary side effects, so we
|
| - // cannot rely on still having fast elements, even if it did to begin
|
| - // with.
|
| - Handle<Object> element;
|
| - LookupIterator it(isolate_, array, i, array, LookupIterator::OWN);
|
| - if (!Object::GetProperty(&it).ToHandle(&element) ||
|
| - !WriteObject(element).FromMaybe(false)) {
|
| - return Nothing<bool>();
|
| - }
|
| - }
|
| - KeyAccumulator accumulator(isolate_, KeyCollectionMode::kOwnOnly,
|
| - ENUMERABLE_STRINGS);
|
| - if (!accumulator.CollectOwnPropertyNames(array, array).FromMaybe(false)) {
|
| - return Nothing<bool>();
|
| - }
|
| - Handle<FixedArray> keys =
|
| - accumulator.GetKeys(GetKeysConversion::kConvertToString);
|
| - uint32_t properties_written;
|
| - if (!WriteJSObjectProperties(array, keys).To(&properties_written)) {
|
| - return Nothing<bool>();
|
| - }
|
| - WriteTag(SerializationTag::kEndDenseJSArray);
|
| - WriteVarint<uint32_t>(properties_written);
|
| - WriteVarint<uint32_t>(length);
|
| - } else {
|
| - WriteTag(SerializationTag::kBeginSparseJSArray);
|
| - WriteVarint<uint32_t>(length);
|
| - Handle<FixedArray> keys;
|
| - uint32_t properties_written;
|
| - if (!KeyAccumulator::GetKeys(array, KeyCollectionMode::kOwnOnly,
|
| - ENUMERABLE_STRINGS)
|
| - .ToHandle(&keys) ||
|
| - !WriteJSObjectProperties(array, keys).To(&properties_written)) {
|
| - return Nothing<bool>();
|
| - }
|
| - WriteTag(SerializationTag::kEndSparseJSArray);
|
| - WriteVarint<uint32_t>(properties_written);
|
| - WriteVarint<uint32_t>(length);
|
| - }
|
| return Just(true);
|
| }
|
|
|
| @@ -527,10 +454,6 @@
|
| }
|
| case SerializationTag::kBeginJSObject:
|
| return ReadJSObject();
|
| - case SerializationTag::kBeginSparseJSArray:
|
| - return ReadSparseJSArray();
|
| - case SerializationTag::kBeginDenseJSArray:
|
| - return ReadDenseJSArray();
|
| default:
|
| return MaybeHandle<Object>();
|
| }
|
| @@ -592,71 +515,6 @@
|
|
|
| DCHECK(HasObjectWithID(id));
|
| return scope.CloseAndEscape(object);
|
| -}
|
| -
|
| -MaybeHandle<JSArray> ValueDeserializer::ReadSparseJSArray() {
|
| - // If we are at the end of the stack, abort. This function may recurse.
|
| - if (StackLimitCheck(isolate_).HasOverflowed()) return MaybeHandle<JSArray>();
|
| -
|
| - uint32_t length;
|
| - if (!ReadVarint<uint32_t>().To(&length)) return MaybeHandle<JSArray>();
|
| -
|
| - uint32_t id = next_id_++;
|
| - HandleScope scope(isolate_);
|
| - Handle<JSArray> array = isolate_->factory()->NewJSArray(0);
|
| - JSArray::SetLength(array, length);
|
| - AddObjectWithID(id, array);
|
| -
|
| - uint32_t num_properties;
|
| - uint32_t expected_num_properties;
|
| - uint32_t expected_length;
|
| - if (!ReadJSObjectProperties(array, SerializationTag::kEndSparseJSArray)
|
| - .To(&num_properties) ||
|
| - !ReadVarint<uint32_t>().To(&expected_num_properties) ||
|
| - !ReadVarint<uint32_t>().To(&expected_length) ||
|
| - num_properties != expected_num_properties || length != expected_length) {
|
| - return MaybeHandle<JSArray>();
|
| - }
|
| -
|
| - DCHECK(HasObjectWithID(id));
|
| - return scope.CloseAndEscape(array);
|
| -}
|
| -
|
| -MaybeHandle<JSArray> ValueDeserializer::ReadDenseJSArray() {
|
| - // If we are at the end of the stack, abort. This function may recurse.
|
| - if (StackLimitCheck(isolate_).HasOverflowed()) return MaybeHandle<JSArray>();
|
| -
|
| - uint32_t length;
|
| - if (!ReadVarint<uint32_t>().To(&length)) return MaybeHandle<JSArray>();
|
| -
|
| - uint32_t id = next_id_++;
|
| - HandleScope scope(isolate_);
|
| - Handle<JSArray> array = isolate_->factory()->NewJSArray(
|
| - FAST_HOLEY_ELEMENTS, length, length, INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE);
|
| - AddObjectWithID(id, array);
|
| -
|
| - Handle<FixedArray> elements(FixedArray::cast(array->elements()), isolate_);
|
| - for (uint32_t i = 0; i < length; i++) {
|
| - Handle<Object> element;
|
| - if (!ReadObject().ToHandle(&element)) return MaybeHandle<JSArray>();
|
| - // TODO(jbroman): Distinguish between undefined and a hole.
|
| - if (element->IsUndefined(isolate_)) continue;
|
| - elements->set(i, *element);
|
| - }
|
| -
|
| - uint32_t num_properties;
|
| - uint32_t expected_num_properties;
|
| - uint32_t expected_length;
|
| - if (!ReadJSObjectProperties(array, SerializationTag::kEndDenseJSArray)
|
| - .To(&num_properties) ||
|
| - !ReadVarint<uint32_t>().To(&expected_num_properties) ||
|
| - !ReadVarint<uint32_t>().To(&expected_length) ||
|
| - num_properties != expected_num_properties || length != expected_length) {
|
| - return MaybeHandle<JSArray>();
|
| - }
|
| -
|
| - DCHECK(HasObjectWithID(id));
|
| - return scope.CloseAndEscape(array);
|
| }
|
|
|
| Maybe<uint32_t> ValueDeserializer::ReadJSObjectProperties(
|
|
|