Chromium Code Reviews| Index: src/elements.cc |
| diff --git a/src/elements.cc b/src/elements.cc |
| index 2ec224c23efd64dc20742affd427db546a8e3092..bc0b89408a920b9e4326111d41e3d3a477b356c3 100644 |
| --- a/src/elements.cc |
| +++ b/src/elements.cc |
| @@ -835,6 +835,56 @@ class ElementsAccessorBase : public ElementsAccessor { |
| from, from_start, *to, from_kind, to_start, packed_size, copy_size); |
| } |
| + Maybe<bool> CollectValuesOrEntries(Isolate* isolate, Handle<JSObject> object, |
| + Handle<FixedArray> values_or_entries, |
| + bool get_entries, int* nof_items, |
| + PropertyFilter filter) { |
| + return ElementsAccessorSubclass::CollectValuesOrEntriesImpl( |
| + isolate, object, values_or_entries, get_entries, nof_items, filter); |
| + } |
| + |
| + static Maybe<bool> CollectValuesOrEntriesImpl( |
| + Isolate* isolate, Handle<JSObject> object, |
| + Handle<FixedArray> values_or_entries, bool get_entries, int* nof_items, |
| + PropertyFilter filter) { |
| + int count = 0; |
| + KeyAccumulator accumulator(isolate, OWN_ONLY, ALL_PROPERTIES); |
| + accumulator.NextPrototype(); |
| + ElementsAccessorSubclass::CollectElementIndicesImpl( |
| + object, handle(object->elements(), isolate), &accumulator, kMaxUInt32, |
| + ALL_PROPERTIES, 0); |
| + Handle<FixedArray> keys = accumulator.GetKeys(); |
| + |
| + for (int i = 0; i < keys->length(); ++i) { |
| + Handle<Object> key(keys->get(i), isolate); |
| + Handle<Object> value; |
| + uint32_t index; |
| + if (!key->ToUint32(&index)) continue; |
| + |
| + uint32_t entry = ElementsAccessorSubclass::GetEntryForIndexImpl( |
| + *object, object->elements(), index, filter); |
| + if (entry == kMaxUInt32) continue; |
| + |
| + PropertyDetails details = |
| + ElementsAccessorSubclass::GetDetailsImpl(*object, entry); |
| + |
| + if (details.kind() == kData) { |
| + value = ElementsAccessorSubclass::GetImpl(object, entry); |
| + } else { |
| + LookupIterator it(isolate, object, index, LookupIterator::OWN); |
| + ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
| + isolate, value, Object::GetProperty(&it), Nothing<bool>()); |
| + } |
| + if (get_entries) { |
| + value = MakeEntryPair(isolate, index, value); |
| + } |
| + values_or_entries->set(count++, *value); |
| + } |
| + |
| + *nof_items = count; |
| + return Just(true); |
| + } |
| + |
| void CollectElementIndices(Handle<JSObject> object, |
| Handle<FixedArrayBase> backing_store, |
| KeyAccumulator* keys, uint32_t range, |
| @@ -1772,6 +1822,24 @@ class FastSmiOrObjectElementsAccessor |
| break; // Nothing to do. |
| } |
| } |
| + |
| + static Maybe<bool> CollectValuesOrEntriesImpl( |
| + Isolate* isolate, Handle<JSObject> object, |
| + Handle<FixedArray> values_or_entries, bool get_entries, int* nof_items, |
| + PropertyFilter filter) { |
| + int count = 0; |
| + Handle<FixedArray> elements(FixedArray::cast(object->elements())); |
| + for (uint32_t index = 0; index < elements->length(); ++index) { |
| + Handle<Object> value(elements->get(index), isolate); |
| + if (value->IsTheHole()) continue; |
| + if (get_entries) { |
| + value = MakeEntryPair(isolate, index, value); |
| + } |
| + values_or_entries->set(count++, *value); |
| + } |
| + *nof_items = count; |
| + return Just(true); |
|
Camillo Bruni
2016/03/15 17:59:52
I think you can combine the FixedArray and FixedDo
caitp (gmail)
2016/03/15 18:24:30
Done
|
| + } |
| }; |
| @@ -1921,6 +1989,25 @@ class FastDoubleElementsAccessor |
| break; |
| } |
| } |
| + |
| + static Maybe<bool> CollectValuesOrEntriesImpl( |
| + Isolate* isolate, Handle<JSObject> object, |
| + Handle<FixedArray> values_or_entries, bool get_entries, int* nof_items, |
| + PropertyFilter filter) { |
| + int count = 0; |
| + Handle<FixedDoubleArray> elements( |
| + FixedDoubleArray::cast(object->elements())); |
| + for (uint32_t index = 0; index < elements->length(); ++index) { |
| + if (elements->is_the_hole(index)) continue; |
| + Handle<Object> value = FixedDoubleArray::get(*elements, index, isolate); |
| + if (get_entries) { |
| + value = MakeEntryPair(isolate, index, value); |
| + } |
| + values_or_entries->set(count++, *value); |
| + } |
| + *nof_items = count; |
| + return Just(true); |
| + } |
| }; |
| @@ -2040,6 +2127,26 @@ class TypedElementsAccessor |
| accumulator->AddKey(value, convert); |
| } |
| } |
| + |
| + static Maybe<bool> CollectValuesOrEntriesImpl( |
| + Isolate* isolate, Handle<JSObject> object, |
| + Handle<FixedArray> values_or_entries, bool get_entries, int* nof_items, |
| + PropertyFilter filter) { |
| + int count = 0; |
| + if ((filter & ONLY_CONFIGURABLE) == 0) { |
| + Handle<FixedArrayBase> elements(object->elements()); |
| + uint32_t length = AccessorClass::GetCapacityImpl(*object, *elements); |
| + for (uint32_t index = 0; index < length; ++index) { |
| + Handle<Object> value = AccessorClass::GetImpl(*elements, index); |
| + if (get_entries) { |
| + value = MakeEntryPair(isolate, index, value); |
| + } |
| + values_or_entries->set(count++, *value); |
| + } |
| + } |
| + *nof_items = count; |
| + return Just(true); |
| + } |
| }; |