| Index: src/hydrogen.cc
|
| ===================================================================
|
| --- src/hydrogen.cc (revision 10428)
|
| +++ src/hydrogen.cc (working copy)
|
| @@ -4266,14 +4266,6 @@
|
| HInstruction* mapcheck = AddInstruction(new(zone()) HCheckMap(object, map));
|
| bool fast_smi_only_elements = map->has_fast_smi_only_elements();
|
| bool fast_elements = map->has_fast_elements();
|
| - bool fast_double_elements = map->has_fast_double_elements();
|
| - if (!fast_smi_only_elements &&
|
| - !fast_elements &&
|
| - !fast_double_elements &&
|
| - !map->has_external_array_elements()) {
|
| - return is_store ? BuildStoreKeyedGeneric(object, key, val)
|
| - : BuildLoadKeyedGeneric(object, key);
|
| - }
|
| HInstruction* elements = AddInstruction(new(zone()) HLoadElements(object));
|
| if (is_store && (fast_elements || fast_smi_only_elements)) {
|
| AddInstruction(new(zone()) HCheckMap(
|
| @@ -4290,7 +4282,9 @@
|
| return BuildExternalArrayElementAccess(external_elements, checked_key,
|
| val, map->elements_kind(), is_store);
|
| }
|
| - ASSERT(fast_smi_only_elements || fast_elements || fast_double_elements);
|
| + ASSERT(fast_smi_only_elements ||
|
| + fast_elements ||
|
| + map->has_fast_double_elements());
|
| if (map->instance_type() == JS_ARRAY_TYPE) {
|
| length = AddInstruction(new(zone()) HJSArrayLength(object, mapcheck));
|
| } else {
|
| @@ -4362,8 +4356,14 @@
|
| // If only one map is left after transitioning, handle this case
|
| // monomorphically.
|
| if (num_untransitionable_maps == 1) {
|
| - HInstruction* instr = AddInstruction(BuildMonomorphicElementAccess(
|
| - object, key, val, untransitionable_map, is_store));
|
| + HInstruction* instr = NULL;
|
| + if (untransitionable_map->has_slow_elements_kind()) {
|
| + instr = AddInstruction(is_store ? BuildStoreKeyedGeneric(object, key, val)
|
| + : BuildLoadKeyedGeneric(object, key));
|
| + } else {
|
| + instr = AddInstruction(BuildMonomorphicElementAccess(
|
| + object, key, val, untransitionable_map, is_store));
|
| + }
|
| *has_side_effects |= instr->HasObservableSideEffects();
|
| instr->set_position(position);
|
| return is_store ? NULL : instr;
|
| @@ -4499,8 +4499,13 @@
|
| HInstruction* instr = NULL;
|
| if (expr->IsMonomorphic()) {
|
| Handle<Map> map = expr->GetMonomorphicReceiverType();
|
| - AddInstruction(new(zone()) HCheckNonSmi(obj));
|
| - instr = BuildMonomorphicElementAccess(obj, key, val, map, is_store);
|
| + if (map->has_slow_elements_kind()) {
|
| + instr = is_store ? BuildStoreKeyedGeneric(obj, key, val)
|
| + : BuildLoadKeyedGeneric(obj, key);
|
| + } else {
|
| + AddInstruction(new(zone()) HCheckNonSmi(obj));
|
| + instr = BuildMonomorphicElementAccess(obj, key, val, map, is_store);
|
| + }
|
| } else if (expr->GetReceiverTypes() != NULL &&
|
| !expr->GetReceiverTypes()->is_empty()) {
|
| return HandlePolymorphicElementAccess(
|
|
|