Chromium Code Reviews| Index: src/elements.cc |
| diff --git a/src/elements.cc b/src/elements.cc |
| index a2068dce5df4d6a4a275436515d9857a78bfd621..b9194519ed54ed14659f78bc4db6e6ae6e420492 100644 |
| --- a/src/elements.cc |
| +++ b/src/elements.cc |
| @@ -585,8 +585,8 @@ class ElementsAccessorBase : public ElementsAccessor { |
| static bool HasElementImpl(Handle<JSObject> holder, uint32_t key, |
| Handle<FixedArrayBase> backing_store) { |
| - return ElementsAccessorSubclass::GetAttributesImpl(holder, key, |
| - backing_store) != ABSENT; |
| + return ElementsAccessorSubclass::GetAttributesImpl( |
| + *holder, key, *backing_store) != ABSENT; |
| } |
| virtual bool HasElement(Handle<JSObject> holder, uint32_t key, |
| @@ -594,9 +594,9 @@ class ElementsAccessorBase : public ElementsAccessor { |
| return ElementsAccessorSubclass::HasElementImpl(holder, key, backing_store); |
| } |
| - MUST_USE_RESULT virtual MaybeHandle<Object> Get( |
| - Handle<Object> receiver, Handle<JSObject> holder, uint32_t key, |
| - Handle<FixedArrayBase> backing_store) final { |
| + virtual Handle<Object> Get(Handle<Object> receiver, Handle<JSObject> holder, |
| + uint32_t key, |
| + Handle<FixedArrayBase> backing_store) final { |
| if (!IsExternalArrayElementsKind(ElementsTraits::Kind) && |
| FLAG_trace_js_array_abuse) { |
| CheckArrayAbuse(holder, "elements read", key); |
| @@ -611,11 +611,9 @@ class ElementsAccessorBase : public ElementsAccessor { |
| receiver, holder, key, backing_store); |
| } |
| - MUST_USE_RESULT static MaybeHandle<Object> GetImpl( |
| - Handle<Object> receiver, |
| - Handle<JSObject> obj, |
| - uint32_t key, |
| - Handle<FixedArrayBase> backing_store) { |
| + static Handle<Object> GetImpl(Handle<Object> receiver, Handle<JSObject> obj, |
| + uint32_t key, |
| + Handle<FixedArrayBase> backing_store) { |
| if (key < ElementsAccessorSubclass::GetCapacityImpl(*obj, *backing_store)) { |
| return BackingStore::get(Handle<BackingStore>::cast(backing_store), key); |
| } else { |
| @@ -623,36 +621,29 @@ class ElementsAccessorBase : public ElementsAccessor { |
| } |
| } |
| - MUST_USE_RESULT virtual PropertyAttributes GetAttributes( |
| - Handle<JSObject> holder, uint32_t key, |
| - Handle<FixedArrayBase> backing_store) final { |
| + virtual PropertyAttributes GetAttributes( |
| + JSObject* holder, uint32_t key, FixedArrayBase* backing_store) final { |
| return ElementsAccessorSubclass::GetAttributesImpl(holder, key, |
| backing_store); |
| } |
| - MUST_USE_RESULT static PropertyAttributes GetAttributesImpl( |
| - Handle<JSObject> obj, |
| - uint32_t key, |
| - Handle<FixedArrayBase> backing_store) { |
| - if (key >= |
| - ElementsAccessorSubclass::GetCapacityImpl(*obj, *backing_store)) { |
| + static PropertyAttributes GetAttributesImpl(JSObject* obj, uint32_t key, |
| + FixedArrayBase* backing_store) { |
| + if (key >= ElementsAccessorSubclass::GetCapacityImpl(obj, backing_store)) { |
| return ABSENT; |
| } |
| - return |
| - Handle<BackingStore>::cast(backing_store)->is_the_hole(key) |
| - ? ABSENT : NONE; |
| + return BackingStore::cast(backing_store)->is_the_hole(key) ? ABSENT : NONE; |
| } |
| - MUST_USE_RESULT virtual MaybeHandle<AccessorPair> GetAccessorPair( |
| + virtual MaybeHandle<AccessorPair> GetAccessorPair( |
| Handle<JSObject> holder, uint32_t key, |
| Handle<FixedArrayBase> backing_store) final { |
| return ElementsAccessorSubclass::GetAccessorPairImpl(holder, key, |
| backing_store); |
| } |
| - MUST_USE_RESULT static MaybeHandle<AccessorPair> GetAccessorPairImpl( |
| - Handle<JSObject> obj, |
| - uint32_t key, |
| + static MaybeHandle<AccessorPair> GetAccessorPairImpl( |
| + Handle<JSObject> obj, uint32_t key, |
| Handle<FixedArrayBase> backing_store) { |
| return MaybeHandle<AccessorPair>(); |
| } |
| @@ -734,7 +725,7 @@ class ElementsAccessorBase : public ElementsAccessor { |
| from, from_start, *to, from_kind, to_start, packed_size, copy_size); |
| } |
| - virtual MaybeHandle<FixedArray> AddElementsToFixedArray( |
| + virtual Handle<FixedArray> AddElementsToFixedArray( |
| Handle<JSObject> receiver, Handle<FixedArray> to, |
| FixedArray::KeyFilter filter) final { |
| Handle<FixedArrayBase> from(receiver->elements()); |
| @@ -760,13 +751,12 @@ class ElementsAccessorBase : public ElementsAccessor { |
| for (uint32_t y = 0; y < len1; y++) { |
| uint32_t key = ElementsAccessorSubclass::GetKeyForIndexImpl(*from, y); |
| if (ElementsAccessorSubclass::HasElementImpl(receiver, key, from)) { |
| - Handle<Object> value; |
| - ASSIGN_RETURN_ON_EXCEPTION( |
| - isolate, value, |
| - ElementsAccessorSubclass::GetImpl(receiver, receiver, key, from), |
| - FixedArray); |
| + Handle<Object> value = |
| + ElementsAccessorSubclass::GetImpl(receiver, receiver, key, from); |
| DCHECK(!value->IsTheHole()); |
| + DCHECK(!value->IsAccessorPair()); |
| + DCHECK(!value->IsExecutableAccessorInfo()); |
| if (filter == FixedArray::NON_SYMBOL_KEYS && value->IsSymbol()) { |
| continue; |
| } |
| @@ -796,11 +786,10 @@ class ElementsAccessorBase : public ElementsAccessor { |
| for (uint32_t y = 0; y < len1; y++) { |
| uint32_t key = ElementsAccessorSubclass::GetKeyForIndexImpl(*from, y); |
| if (ElementsAccessorSubclass::HasElementImpl(receiver, key, from)) { |
| - Handle<Object> value; |
| - ASSIGN_RETURN_ON_EXCEPTION( |
| - isolate, value, |
| - ElementsAccessorSubclass::GetImpl(receiver, receiver, key, from), |
| - FixedArray); |
| + Handle<Object> value = |
| + ElementsAccessorSubclass::GetImpl(receiver, receiver, key, from); |
| + DCHECK(!value->IsAccessorPair()); |
| + DCHECK(!value->IsExecutableAccessorInfo()); |
| if (filter == FixedArray::NON_SYMBOL_KEYS && value->IsSymbol()) { |
| continue; |
| } |
| @@ -1274,11 +1263,9 @@ class TypedElementsAccessor |
| friend class ElementsAccessorBase<AccessorClass, |
| ElementsKindTraits<Kind> >; |
| - MUST_USE_RESULT static MaybeHandle<Object> GetImpl( |
| - Handle<Object> receiver, |
| - Handle<JSObject> obj, |
| - uint32_t key, |
| - Handle<FixedArrayBase> backing_store) { |
| + static Handle<Object> GetImpl(Handle<Object> receiver, Handle<JSObject> obj, |
| + uint32_t key, |
| + Handle<FixedArrayBase> backing_store) { |
| if (key < AccessorClass::GetCapacityImpl(*obj, *backing_store)) { |
| return BackingStore::get(Handle<BackingStore>::cast(backing_store), key); |
| } else { |
| @@ -1286,12 +1273,10 @@ class TypedElementsAccessor |
| } |
| } |
| - MUST_USE_RESULT static PropertyAttributes GetAttributesImpl( |
| - Handle<JSObject> obj, |
| - uint32_t key, |
| - Handle<FixedArrayBase> backing_store) { |
| - return key < AccessorClass::GetCapacityImpl(*obj, *backing_store) ? NONE |
| - : ABSENT; |
| + static PropertyAttributes GetAttributesImpl(JSObject* obj, uint32_t key, |
| + FixedArrayBase* backing_store) { |
| + return key < AccessorClass::GetCapacityImpl(obj, backing_store) ? NONE |
| + : ABSENT; |
| } |
| MUST_USE_RESULT static MaybeHandle<Object> SetLengthImpl( |
| @@ -1462,34 +1447,22 @@ class DictionaryElementsAccessor |
| return DeleteCommon(obj, key, language_mode); |
| } |
| - MUST_USE_RESULT static MaybeHandle<Object> GetImpl( |
| - Handle<Object> receiver, |
| - Handle<JSObject> obj, |
| - uint32_t key, |
| - Handle<FixedArrayBase> store) { |
| + static Handle<Object> GetImpl(Handle<Object> receiver, Handle<JSObject> obj, |
| + uint32_t key, Handle<FixedArrayBase> store) { |
| Handle<SeededNumberDictionary> backing_store = |
| Handle<SeededNumberDictionary>::cast(store); |
| Isolate* isolate = backing_store->GetIsolate(); |
| int entry = backing_store->FindEntry(key); |
| if (entry != SeededNumberDictionary::kNotFound) { |
| - Handle<Object> element(backing_store->ValueAt(entry), isolate); |
| - PropertyDetails details = backing_store->DetailsAt(entry); |
| - if (details.type() == ACCESSOR_CONSTANT) { |
| - return JSObject::GetElementWithCallback( |
| - obj, receiver, element, key, obj); |
| - } else { |
| - return element; |
| - } |
| + return handle(backing_store->ValueAt(entry), isolate); |
| } |
| return isolate->factory()->the_hole_value(); |
| } |
| - MUST_USE_RESULT static PropertyAttributes GetAttributesImpl( |
| - Handle<JSObject> obj, |
| - uint32_t key, |
| - Handle<FixedArrayBase> backing_store) { |
| - Handle<SeededNumberDictionary> dictionary = |
| - Handle<SeededNumberDictionary>::cast(backing_store); |
| + static PropertyAttributes GetAttributesImpl(JSObject* obj, uint32_t key, |
| + FixedArrayBase* backing_store) { |
| + SeededNumberDictionary* dictionary = |
| + SeededNumberDictionary::cast(backing_store); |
| int entry = dictionary->FindEntry(key); |
| if (entry != SeededNumberDictionary::kNotFound) { |
| return dictionary->DetailsAt(entry).attributes(); |
| @@ -1497,10 +1470,8 @@ class DictionaryElementsAccessor |
| return ABSENT; |
| } |
| - MUST_USE_RESULT static MaybeHandle<AccessorPair> GetAccessorPairImpl( |
| - Handle<JSObject> obj, |
| - uint32_t key, |
| - Handle<FixedArrayBase> store) { |
| + static MaybeHandle<AccessorPair> GetAccessorPairImpl( |
| + Handle<JSObject> obj, uint32_t key, Handle<FixedArrayBase> store) { |
| Handle<SeededNumberDictionary> backing_store = |
| Handle<SeededNumberDictionary>::cast(store); |
| int entry = backing_store->FindEntry(key); |
| @@ -1556,14 +1527,12 @@ class SloppyArgumentsElementsAccessor : public ElementsAccessorBase< |
| SloppyArgumentsElementsAccessor, |
| ElementsKindTraits<SLOPPY_ARGUMENTS_ELEMENTS> >; |
| - MUST_USE_RESULT static MaybeHandle<Object> GetImpl( |
| - Handle<Object> receiver, |
| - Handle<JSObject> obj, |
| - uint32_t key, |
| - Handle<FixedArrayBase> parameters) { |
| + static Handle<Object> GetImpl(Handle<Object> receiver, Handle<JSObject> obj, |
| + uint32_t key, |
| + Handle<FixedArrayBase> parameters) { |
| Isolate* isolate = obj->GetIsolate(); |
| Handle<FixedArray> parameter_map = Handle<FixedArray>::cast(parameters); |
| - Handle<Object> probe = GetParameterMapArg(obj, parameter_map, key); |
| + Handle<Object> probe(GetParameterMapArg(*parameter_map, key), isolate); |
| if (!probe->IsTheHole()) { |
| DisallowHeapAllocation no_gc; |
| Context* context = Context::cast(parameter_map->get(0)); |
| @@ -1574,12 +1543,8 @@ class SloppyArgumentsElementsAccessor : public ElementsAccessorBase< |
| // Object is not mapped, defer to the arguments. |
| Handle<FixedArray> arguments(FixedArray::cast(parameter_map->get(1)), |
| isolate); |
| - Handle<Object> result; |
| - ASSIGN_RETURN_ON_EXCEPTION( |
| - isolate, result, |
| - ElementsAccessor::ForArray(arguments)->Get( |
| - receiver, obj, key, arguments), |
| - Object); |
| + Handle<Object> result = ElementsAccessor::ForArray(arguments) |
| + ->Get(receiver, obj, key, arguments); |
| // Elements of the arguments object in slow mode might be slow aliases. |
| if (result->IsAliasedArgumentsEntry()) { |
| DisallowHeapAllocation no_gc; |
| @@ -1594,28 +1559,25 @@ class SloppyArgumentsElementsAccessor : public ElementsAccessorBase< |
| } |
| } |
| - MUST_USE_RESULT static PropertyAttributes GetAttributesImpl( |
| - Handle<JSObject> obj, |
| - uint32_t key, |
| - Handle<FixedArrayBase> backing_store) { |
| - Handle<FixedArray> parameter_map = Handle<FixedArray>::cast(backing_store); |
| - Handle<Object> probe = GetParameterMapArg(obj, parameter_map, key); |
| + static PropertyAttributes GetAttributesImpl(JSObject* obj, uint32_t key, |
| + FixedArrayBase* backing_store) { |
| + FixedArray* parameter_map = FixedArray::cast(backing_store); |
| + Object* probe = GetParameterMapArg(parameter_map, key); |
| if (!probe->IsTheHole()) { |
| return NONE; |
| } else { |
| // If not aliased, check the arguments. |
| - Handle<FixedArray> arguments(FixedArray::cast(parameter_map->get(1))); |
| + FixedArray* arguments = FixedArray::cast(parameter_map->get(1)); |
| return ElementsAccessor::ForArray(arguments) |
| ->GetAttributes(obj, key, arguments); |
| } |
| } |
| - MUST_USE_RESULT static MaybeHandle<AccessorPair> GetAccessorPairImpl( |
| - Handle<JSObject> obj, |
| - uint32_t key, |
| - Handle<FixedArrayBase> parameters) { |
| + static MaybeHandle<AccessorPair> GetAccessorPairImpl( |
| + Handle<JSObject> obj, uint32_t key, Handle<FixedArrayBase> parameters) { |
| Handle<FixedArray> parameter_map = Handle<FixedArray>::cast(parameters); |
| - Handle<Object> probe = GetParameterMapArg(obj, parameter_map, key); |
| + Handle<Object> probe(GetParameterMapArg(*parameter_map, key), |
| + obj->GetIsolate()); |
| if (!probe->IsTheHole()) { |
| return MaybeHandle<AccessorPair>(); |
| } else { |
| @@ -1640,7 +1602,7 @@ class SloppyArgumentsElementsAccessor : public ElementsAccessorBase< |
| Handle<JSObject> obj, uint32_t key, LanguageMode language_mode) final { |
| Isolate* isolate = obj->GetIsolate(); |
| Handle<FixedArray> parameter_map(FixedArray::cast(obj->elements())); |
| - Handle<Object> probe = GetParameterMapArg(obj, parameter_map, key); |
| + Handle<Object> probe(GetParameterMapArg(*parameter_map, key), isolate); |
| if (!probe->IsTheHole()) { |
| // TODO(kmillikin): We could check if this was the last aliased |
| // parameter, and revert to normal elements in that case. That |
| @@ -1681,27 +1643,38 @@ class SloppyArgumentsElementsAccessor : public ElementsAccessorBase< |
| return index; |
|
Igor Sheludko
2015/05/26 17:11:56
I think we should not break this invariant:
DCHECK
|
| } |
| - static uint32_t GetIndexForKeyImpl(FixedArrayBase* dict, uint32_t key) { |
| - return key; |
| + static uint32_t GetIndexForKeyImpl(FixedArrayBase* parameters, uint32_t key) { |
| + FixedArray* parameter_map = FixedArray::cast(parameters); |
| + Object* probe = GetParameterMapArg(parameter_map, key); |
| + if (!probe->IsTheHole()) { |
| + return key; |
| + } else { |
| + uint32_t length = parameter_map->length(); |
| + FixedArray* arguments = FixedArray::cast(parameter_map->get(1)); |
| + return length + |
| + ElementsAccessor::ForArray(arguments) |
| + ->GetIndexForKey(arguments, key); |
| + } |
| } |
| - static PropertyDetails GetDetailsImpl(FixedArrayBase* backing_store, |
| + static PropertyDetails GetDetailsImpl(FixedArrayBase* parameters, |
| uint32_t index) { |
| - return PropertyDetails(NONE, DATA, 0, PropertyCellType::kNoCell); |
| + FixedArray* parameter_map = FixedArray::cast(parameters); |
| + uint32_t length = parameter_map->length(); |
| + if (index < length) { |
| + return PropertyDetails(NONE, DATA, 0, PropertyCellType::kNoCell); |
| + } |
| + index -= length; |
| + FixedArray* arguments = FixedArray::cast(parameter_map->get(1)); |
| + return ElementsAccessor::ForArray(arguments)->GetDetails(arguments, index); |
| } |
| - |
| private: |
| - static Handle<Object> GetParameterMapArg(Handle<JSObject> holder, |
| - Handle<FixedArray> parameter_map, |
| - uint32_t key) { |
| - Isolate* isolate = holder->GetIsolate(); |
| - uint32_t length = holder->IsJSArray() |
| - ? Smi::cast(Handle<JSArray>::cast(holder)->length())->value() |
| - : parameter_map->length(); |
| + static Object* GetParameterMapArg(FixedArray* parameter_map, uint32_t key) { |
| + uint32_t length = parameter_map->length(); |
| return key < (length - 2) |
| - ? handle(parameter_map->get(key + 2), isolate) |
| - : Handle<Object>::cast(isolate->factory()->the_hole_value()); |
| + ? parameter_map->get(key + 2) |
| + : Object::cast(parameter_map->GetHeap()->the_hole_value()); |
| } |
| }; |
| @@ -1782,7 +1755,7 @@ MaybeHandle<Object> ElementsAccessorBase<ElementsAccessorSubclass, |
| // to slow elements is needed for other reasons. |
| if (length->IsNumber()) { |
| uint32_t value; |
| - if (length->ToArrayIndex(&value)) { |
| + if (length->ToArrayLength(&value)) { |
| Handle<SeededNumberDictionary> dictionary = |
| JSObject::NormalizeElements(array); |
| DCHECK(!dictionary.is_null()); |