*holder, *backing_store, index) != kMaxUInt32;
}
- virtual Handle<Object> Get(Handle<JSObject> holder, uint32_t index,
- Handle<FixedArrayBase> backing_store) final {
- if (!IsExternalArrayElementsKind(ElementsTraits::Kind) &&
- FLAG_trace_js_array_abuse) {
- CheckArrayAbuse(holder, "elements read", index);
- }
-
- if (IsExternalArrayElementsKind(ElementsTraits::Kind) &&
- FLAG_trace_external_array_abuse) {
- CheckArrayAbuse(holder, "external elements read", index);
- }
-
- return ElementsAccessorSubclass::GetImpl(holder, index, backing_store);
+ virtual Handle<Object> Get(Handle<FixedArrayBase> backing_store,
+ uint32_t entry) final {
+ return ElementsAccessorSubclass::GetImpl(backing_store, entry);
}
- static Handle<Object> GetImpl(Handle<JSObject> obj, uint32_t index,
- Handle<FixedArrayBase> backing_store) {
- if (index <
- ElementsAccessorSubclass::GetCapacityImpl(*obj, *backing_store)) {
- return BackingStore::get(Handle<BackingStore>::cast(backing_store),
- index);
- } else {
- return backing_store->GetIsolate()->factory()->the_hole_value();
- }
+ static Handle<Object> GetImpl(Handle<FixedArrayBase> backing_store,
+ uint32_t entry) {
+ uint32_t index = GetIndexForEntryImpl(*backing_store, entry);
+ return BackingStore::get(Handle<BackingStore>::cast(backing_store), index);
}
virtual void Set(FixedArrayBase* backing_store, uint32_t entry,
uint32_t extra = 0;
for (uint32_t y = 0; y < len1; y++) {
if (ElementsAccessorSubclass::HasEntryImpl(*from, y)) {
- uint32_t index =
- ElementsAccessorSubclass::GetIndexForEntryImpl(*from, y);
- Handle<Object> value =
- ElementsAccessorSubclass::GetImpl(receiver, index, from);
+ Handle<Object> value = ElementsAccessorSubclass::GetImpl(from, y);
DCHECK(!value->IsTheHole());
DCHECK(!value->IsAccessorPair());
uint32_t entry = 0;
for (uint32_t y = 0; y < len1; y++) {
if (ElementsAccessorSubclass::HasEntryImpl(*from, y)) {
- uint32_t index =
- ElementsAccessorSubclass::GetIndexForEntryImpl(*from, y);
- Handle<Object> value =
- ElementsAccessorSubclass::GetImpl(receiver, index, from);
+ Handle<Object> value = ElementsAccessorSubclass::GetImpl(from, y);
DCHECK(!value->IsAccessorPair());
DCHECK(!value->IsExecutableAccessorInfo());
if (filter == FixedArray::NON_SYMBOL_KEYS && value->IsSymbol()) {
static uint32_t GetEntryForIndexImpl(JSObject* holder,
FixedArrayBase* backing_store,
uint32_t index) {
- return index < ElementsAccessorSubclass::GetCapacityImpl(holder,
- backing_store) &&
- !BackingStore::cast(backing_store)->is_the_hole(index)
- ? index
- : kMaxUInt32;
+ if (IsHoleyElementsKind(kind())) {
+ return index < ElementsAccessorSubclass::GetCapacityImpl(holder,
+ backing_store) &&
+ !BackingStore::cast(backing_store)->is_the_hole(index)
+ ? index
+ : kMaxUInt32;
+ } else {
+ Smi* smi_length = Smi::cast(JSArray::cast(holder)->length());
+ uint32_t length = static_cast<uint32_t>(smi_length->value());
+ return index < length ? index : kMaxUInt32;
+ }
}
virtual uint32_t GetEntryForIndex(JSObject* holder,
obj->set_elements(*new_elements);
}
- static Handle<Object> GetImpl(Handle<JSObject> obj, uint32_t index,
- Handle<FixedArrayBase> store) {
+ static Handle<Object> GetImpl(Handle<FixedArrayBase> store, uint32_t entry) {
Handle<SeededNumberDictionary> backing_store =
Handle<SeededNumberDictionary>::cast(store);
Isolate* isolate = backing_store->GetIsolate();
- int entry = backing_store->FindEntry(index);
- if (entry != SeededNumberDictionary::kNotFound) {
- return handle(backing_store->ValueAt(entry), isolate);
- }
- return isolate->factory()->the_hole_value();
+ return handle(backing_store->ValueAt(entry), isolate);
}
static void SetImpl(FixedArrayBase* store, uint32_t entry, Object* value) {
typedef typename ElementsKindTraits<Kind>::BackingStore BackingStore;
typedef TypedElementsAccessor<Kind> AccessorClass;
- static Handle<Object> GetImpl(Handle<JSObject> obj, uint32_t index,
- Handle<FixedArrayBase> backing_store) {
- if (index < AccessorClass::GetCapacityImpl(*obj, *backing_store)) {
- return BackingStore::get(Handle<BackingStore>::cast(backing_store),
- index);
- } else {
- return backing_store->GetIsolate()->factory()->undefined_value();
- }
+ static Handle<Object> GetImpl(Handle<FixedArrayBase> backing_store,
+ uint32_t entry) {
+ uint32_t index = GetIndexForEntryImpl(*backing_store, entry);
+ return BackingStore::get(Handle<BackingStore>::cast(backing_store), index);
}
static PropertyDetails GetDetailsImpl(FixedArrayBase* backing_store,
UNREACHABLE();
}
+ static uint32_t GetIndexForEntryImpl(FixedArrayBase* backing_store,
+ uint32_t entry) {
+ return entry;
+ }
+
static uint32_t GetEntryForIndexImpl(JSObject* holder,
FixedArrayBase* backing_store,
uint32_t index) {
public:
explicit SloppyArgumentsElementsAccessor(const char* name)
: ElementsAccessorBase<SloppyArgumentsElementsAccessorSubclass,
- KindTraits>(name) {}
+ KindTraits>(name) {
+ USE(KindTraits::Kind);
+ }
- static Handle<Object> GetImpl(Handle<JSObject> obj, uint32_t index,
- Handle<FixedArrayBase> parameters) {
- Isolate* isolate = obj->GetIsolate();
+ static Handle<Object> GetImpl(Handle<FixedArrayBase> parameters,
+ uint32_t entry) {
+ Isolate* isolate = parameters->GetIsolate();
Handle<FixedArray> parameter_map = Handle<FixedArray>::cast(parameters);
- Handle<Object> probe(GetParameterMapArg(*parameter_map, index), isolate);
- if (!probe->IsTheHole()) {
+ uint32_t length = parameter_map->length() - 2;
+ if (entry < length) {
DisallowHeapAllocation no_gc;
+ Object* probe = parameter_map->get(entry + 2);
Context* context = Context::cast(parameter_map->get(0));
- int context_entry = Handle<Smi>::cast(probe)->value();
+ int context_entry = Smi::cast(probe)->value();
DCHECK(!context->get(context_entry)->IsTheHole());
return handle(context->get(context_entry), isolate);
} else {
// Object is not mapped, defer to the arguments.
Handle<FixedArray> arguments(FixedArray::cast(parameter_map->get(1)),
isolate);
- Handle<Object> result = ArgumentsAccessor::GetImpl(obj, index, arguments);
+ Handle<Object> result =
+ ArgumentsAccessor::GetImpl(arguments, entry - length);
// Elements of the arguments object in slow mode might be slow aliases.
if (result->IsAliasedArgumentsEntry()) {
DisallowHeapAllocation no_gc;
int context_entry = entry->aliased_context_slot();
DCHECK(!context->get(context_entry)->IsTheHole());
return handle(context->get(context_entry), isolate);
- } else {
- return result;
}
+ return result;
}
}