| Index: src/hydrogen.cc
|
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc
|
| index 337c35b87b76e897e131848e58a0a191e2ec739f..06948a15f6448457d4cee1c5eb5c3ec59e4cadeb 100644
|
| --- a/src/hydrogen.cc
|
| +++ b/src/hydrogen.cc
|
| @@ -7452,37 +7452,36 @@ HInstruction* HOptimizedGraphBuilder::TryBuildConsolidatedElementLoad(
|
| : most_general_consolidated_map->elements_kind();
|
| LoadKeyedHoleMode load_mode = NEVER_RETURN_HOLE;
|
| if (has_seen_holey_elements) {
|
| - if (!isolate()->IsFastArrayConstructorPrototypeChainIntact()) {
|
| - return NULL;
|
| - }
|
| -
|
| // Make sure that all of the maps we are handling have the initial array
|
| // prototype.
|
| + bool saw_non_array_prototype = false;
|
| for (int i = 0; i < maps->length(); ++i) {
|
| Handle<Map> map = maps->at(i);
|
| if (map->prototype() != *isolate()->initial_array_prototype()) {
|
| // We can't guarantee that loading the hole is safe. The prototype may
|
| // have an element at this position.
|
| - return NULL;
|
| + saw_non_array_prototype = true;
|
| + break;
|
| }
|
| }
|
|
|
| - Handle<Map> holey_map =
|
| - handle(isolate()->get_initial_js_array_map(consolidated_elements_kind));
|
| - load_mode = BuildKeyedHoleMode(holey_map);
|
| - if (load_mode == NEVER_RETURN_HOLE) {
|
| - return NULL;
|
| - }
|
| -
|
| - for (int i = 0; i < maps->length(); ++i) {
|
| - Handle<Map> map = maps->at(i);
|
| - // The prototype check was already done for the holey map in
|
| - // BuildKeyedHoleMode.
|
| - if (!map.is_identical_to(holey_map)) {
|
| - Handle<JSObject> prototype(JSObject::cast(map->prototype()), isolate());
|
| - Handle<JSObject> object_prototype =
|
| - isolate()->initial_object_prototype();
|
| - BuildCheckPrototypeMaps(prototype, object_prototype);
|
| + if (!saw_non_array_prototype) {
|
| + Handle<Map> holey_map = handle(
|
| + isolate()->get_initial_js_array_map(consolidated_elements_kind));
|
| + load_mode = BuildKeyedHoleMode(holey_map);
|
| + if (load_mode != NEVER_RETURN_HOLE) {
|
| + for (int i = 0; i < maps->length(); ++i) {
|
| + Handle<Map> map = maps->at(i);
|
| + // The prototype check was already done for the holey map in
|
| + // BuildKeyedHoleMode.
|
| + if (!map.is_identical_to(holey_map)) {
|
| + Handle<JSObject> prototype(JSObject::cast(map->prototype()),
|
| + isolate());
|
| + Handle<JSObject> object_prototype =
|
| + isolate()->initial_object_prototype();
|
| + BuildCheckPrototypeMaps(prototype, object_prototype);
|
| + }
|
| + }
|
| }
|
| }
|
| }
|
|
|