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()); |