| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 0f07a2fd44a23a7256628198c07053b6d223f470..9a903f1ff59ad217d25a74e53589927ea1d12ff7 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -858,10 +858,30 @@ MaybeHandle<Object> Object::GetMethod(Handle<JSReceiver> receiver,
|
| return func;
|
| }
|
|
|
| +namespace {
|
| +MaybeHandle<FixedArray> CreateListFromArrayLikeFastPath(
|
| + Isolate* isolate, Handle<Object> object, ElementTypes element_types) {
|
| + if (element_types != ElementTypes::kAll || !object->IsJSArray()) {
|
| + return MaybeHandle<FixedArray>();
|
| + }
|
| + Handle<JSArray> array = Handle<JSArray>::cast(object);
|
| + uint32_t length;
|
| + if (!array->HasArrayPrototype(isolate) ||
|
| + !array->length()->ToUint32(&length) || !array->HasFastElements() ||
|
| + !JSObject::PrototypeHasNoElements(isolate, *array)) {
|
| + return MaybeHandle<FixedArray>();
|
| + }
|
| + return array->GetElementsAccessor()->CreateListFromArray(isolate, array);
|
| +}
|
| +} // namespace
|
|
|
| // static
|
| MaybeHandle<FixedArray> Object::CreateListFromArrayLike(
|
| Isolate* isolate, Handle<Object> object, ElementTypes element_types) {
|
| + // Fast-path for JS_ARRAY_TYPE.
|
| + MaybeHandle<FixedArray> fast_result =
|
| + CreateListFromArrayLikeFastPath(isolate, object, element_types);
|
| + if (!fast_result.is_null()) return fast_result;
|
| // 1. ReturnIfAbrupt(object).
|
| // 2. (default elementTypes -- not applicable.)
|
| // 3. If Type(obj) is not Object, throw a TypeError exception.
|
| @@ -872,6 +892,7 @@ MaybeHandle<FixedArray> Object::CreateListFromArrayLike(
|
| "CreateListFromArrayLike")),
|
| FixedArray);
|
| }
|
| +
|
| // 4. Let len be ? ToLength(? Get(obj, "length")).
|
| Handle<JSReceiver> receiver = Handle<JSReceiver>::cast(object);
|
| Handle<Object> raw_length_number;
|
|
|