Index: src/elements.cc |
diff --git a/src/elements.cc b/src/elements.cc |
index 3d176aef8033433615fa428fd6298533ac8bf34b..7afa08f8723142ba5936c48ef23220611e42b9eb 100644 |
--- a/src/elements.cc |
+++ b/src/elements.cc |
@@ -1453,7 +1453,8 @@ class FastElementsAccessor |
} |
if (entry == 0) { |
FixedArray* empty = heap->empty_fixed_array(); |
- if (obj->HasFastArgumentsElements()) { |
+ if (FastElementsAccessorSubclass::kind() == |
+ FAST_SLOPPY_ARGUMENTS_ELEMENTS) { |
FixedArray::cast(obj->elements())->set(1, empty); |
} else { |
obj->set_elements(empty); |
@@ -2568,16 +2569,45 @@ class FastSloppyArgumentsElementsAccessor |
FastHoleyObjectElementsAccessor, |
ElementsKindTraits<FAST_SLOPPY_ARGUMENTS_ELEMENTS> >(name) {} |
+ static Handle<FixedArray> GetArguments(Isolate* isolate, |
+ FixedArrayBase* backing_store) { |
+ FixedArray* parameter_map = FixedArray::cast(backing_store); |
+ return Handle<FixedArray>(FixedArray::cast(parameter_map->get(1)), isolate); |
+ } |
+ |
+ static Handle<JSArray> SliceImpl(Handle<JSObject> receiver, uint32_t start, |
+ uint32_t end) { |
+ Isolate* isolate = receiver->GetIsolate(); |
+ uint32_t result_len = end < start ? 0u : end - start; |
+ Handle<JSArray> result_array = isolate->factory()->NewJSArray( |
+ FAST_HOLEY_ELEMENTS, result_len, result_len); |
+ DisallowHeapAllocation no_gc; |
+ FixedArray* elements = FixedArray::cast(result_array->elements()); |
+ FixedArray* parameters = FixedArray::cast(receiver->elements()); |
+ uint32_t insertion_index = 0; |
+ for (uint32_t i = start; i < end; i++) { |
+ uint32_t entry = |
+ GetEntryForIndexImpl(*receiver, parameters, i, ALL_PROPERTIES); |
+ if (entry != kMaxUInt32 && HasEntryImpl(parameters, entry)) { |
+ elements->set(insertion_index, *GetImpl(parameters, entry)); |
+ } else { |
+ elements->set_the_hole(insertion_index); |
+ } |
+ insertion_index++; |
+ } |
+ return result_array; |
+ } |
+ |
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))); |
+ Handle<FixedArray> arguments = |
+ GetArguments(elements->GetIsolate(), *elements); |
return FastHoleyObjectElementsAccessor::NormalizeImpl(object, arguments); |
} |
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))); |
+ Handle<FixedArray> arguments = |
+ GetArguments(obj->GetIsolate(), obj->elements()); |
FastHoleyObjectElementsAccessor::DeleteCommon(obj, entry, arguments); |
} |