| Index: src/builtins.cc
|
| diff --git a/src/builtins.cc b/src/builtins.cc
|
| index 347b428d5c250d00d8d3f3f096fdb84d42926536..2cb65a1588e138dbf387d85891973cc3899735b4 100644
|
| --- a/src/builtins.cc
|
| +++ b/src/builtins.cc
|
| @@ -207,9 +207,14 @@ inline bool ClampedToInteger(Object* object, int* out) {
|
|
|
| inline bool GetSloppyArgumentsLength(Isolate* isolate, Handle<JSObject> object,
|
| int* out) {
|
| - Map* arguments_map = isolate->native_context()->sloppy_arguments_map();
|
| - if (object->map() != arguments_map) return false;
|
| - DCHECK(object->HasFastElements());
|
| + Context* context = *isolate->native_context();
|
| + Map* map = object->map();
|
| + if (map != context->sloppy_arguments_map() &&
|
| + map != context->strict_arguments_map() &&
|
| + map != context->fast_aliased_arguments_map()) {
|
| + return false;
|
| + }
|
| + DCHECK(object->HasFastElements() || object->HasFastArgumentsElements());
|
| Object* len_obj = object->InObjectPropertyAt(JSArgumentsObject::kLengthIndex);
|
| if (!len_obj->IsSmi()) return false;
|
| *out = Max(0, Smi::cast(len_obj)->value());
|
| @@ -670,10 +675,11 @@ BUILTIN(ArraySlice) {
|
| } else if (receiver->IsJSObject() &&
|
| GetSloppyArgumentsLength(isolate, Handle<JSObject>::cast(receiver),
|
| &len)) {
|
| - DCHECK_EQ(FAST_ELEMENTS, JSObject::cast(*receiver)->GetElementsKind());
|
| - // Array.prototype.slice(arguments, ...) is quite a common idiom
|
| + // Array.prototype.slice.call(arguments, ...) is quite a common idiom
|
| // (notably more than 50% of invocations in Web apps).
|
| // Treat it in C++ as well.
|
| + DCHECK(JSObject::cast(*receiver)->HasFastElements() ||
|
| + JSObject::cast(*receiver)->HasFastArgumentsElements());
|
| } else {
|
| AllowHeapAllocation allow_allocation;
|
| return CallJsIntrinsic(isolate, isolate->array_slice(), args);
|
|
|