Chromium Code Reviews| Index: src/elements.cc |
| diff --git a/src/elements.cc b/src/elements.cc |
| index 7746d8df07d71f3de4fd29f3b09301a3b497ab63..3881d5653418d3e83fc06aac38c30333d0c236f7 100644 |
| --- a/src/elements.cc |
| +++ b/src/elements.cc |
| @@ -835,6 +835,17 @@ class ElementsAccessorBase : public ElementsAccessor { |
| from, from_start, *to, from_kind, to_start, packed_size, copy_size); |
| } |
| + Handle<SeededNumberDictionary> Normalize( |
| + Handle<JSObject> object, Handle<FixedArrayBase> elements) final { |
| + return ElementsAccessorSubclass::NormalizeImpl(object, elements); |
| + } |
| + |
| + static Handle<SeededNumberDictionary> NormalizeImpl( |
| + Handle<JSObject> object, Handle<FixedArrayBase> elements) { |
| + UNREACHABLE(); |
| + return Handle<SeededNumberDictionary>(); |
| + } |
| + |
| void CollectElementIndices(Handle<JSObject> object, |
| Handle<FixedArrayBase> backing_store, |
| KeyAccumulator* keys, uint32_t range, |
| @@ -1268,6 +1279,36 @@ class FastElementsAccessor |
| typedef typename KindTraits::BackingStore BackingStore; |
| + static Handle<SeededNumberDictionary> NormalizeImpl( |
| + Handle<JSObject> object, Handle<FixedArrayBase> store) { |
| + Isolate* isolate = store->GetIsolate(); |
| + ElementsKind kind = FastElementsAccessorSubclass::kind(); |
| + |
| + // Ensure that notifications fire if the array or object prototypes are |
| + // normalizing. |
| + if (IsFastSmiOrObjectElementsKind(kind)) { |
| + isolate->UpdateArrayProtectorOnNormalizeElements(object); |
| + } |
| + |
| + int capacity = object->GetFastElementsUsage(); |
| + Handle<SeededNumberDictionary> dictionary = |
| + SeededNumberDictionary::New(isolate, capacity); |
| + |
| + PropertyDetails details = PropertyDetails::Empty(); |
| + bool used_as_prototype = object->map()->is_prototype_map(); |
| + int j = 0; |
| + for (int i = 0; j < capacity; i++) { |
| + if (IsHoleyElementsKind(kind)) { |
| + if (BackingStore::cast(*store)->is_the_hole(i)) continue; |
| + } |
| + Handle<Object> value = FastElementsAccessorSubclass::GetImpl(*store, i); |
| + dictionary = SeededNumberDictionary::AddNumberEntry( |
| + dictionary, i, value, details, used_as_prototype); |
| + j++; |
| + } |
| + return dictionary; |
| + } |
| + |
| static void DeleteAtEnd(Handle<JSObject> obj, |
| Handle<BackingStore> backing_store, uint32_t entry) { |
| uint32_t length = static_cast<uint32_t>(backing_store->length()); |
| @@ -2366,6 +2407,13 @@ class FastSloppyArgumentsElementsAccessor |
| FastHoleyObjectElementsAccessor, |
| ElementsKindTraits<FAST_SLOPPY_ARGUMENTS_ELEMENTS> >(name) {} |
| + static Handle<SeededNumberDictionary> NormalizeImpl( |
| + Handle<JSObject> object, Handle<FixedArrayBase> elements) { |
| + FixedArray* parameter_map = FixedArray::cast(*elements); |
| + Handle<FixedArray> arguments(FixedArray::cast(parameter_map->get(1))); |
| + return FastHoleyObjectElementsAccessor::NormalizeImpl(object, arguments); |
| + } |
|
Camillo Bruni
2016/03/15 13:12:22
I think you have to push this up to SloppyArgument
|
| + |
| static void DeleteFromArguments(Handle<JSObject> obj, uint32_t entry) { |
| FixedArray* parameter_map = FixedArray::cast(obj->elements()); |
| Handle<FixedArray> arguments(FixedArray::cast(parameter_map->get(1))); |
| @@ -2588,6 +2636,11 @@ class FastStringWrapperElementsAccessor |
| : StringWrapperElementsAccessor< |
| FastStringWrapperElementsAccessor, FastHoleyObjectElementsAccessor, |
| ElementsKindTraits<FAST_STRING_WRAPPER_ELEMENTS>>(name) {} |
| + |
| + static Handle<SeededNumberDictionary> NormalizeImpl( |
| + Handle<JSObject> object, Handle<FixedArrayBase> elements) { |
| + return FastHoleyObjectElementsAccessor::NormalizeImpl(object, elements); |
| + } |
| }; |
| class SlowStringWrapperElementsAccessor |