Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index 7d0e228e8eeae3e88bc930be8d518966713afa99..900fa271729e7f7b545402e1cccf0f7c77d3f293 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -4369,7 +4369,8 @@ void HGraphBuilder::VisitForInStatement(ForInStatement* stmt) { |
HValue* key = AddInstruction( |
new(zone()) HLoadKeyedFastElement( |
environment()->ExpressionStackAt(2), // Enum cache. |
- environment()->ExpressionStackAt(0))); // Iteration index. |
+ environment()->ExpressionStackAt(0), // Iteration index. |
+ environment()->ExpressionStackAt(0))); |
// Check if the expected map still matches that of the enumerable. |
// If not just deoptimize. |
@@ -5709,6 +5710,7 @@ HInstruction* HGraphBuilder::BuildExternalArrayElementAccess( |
HValue* external_elements, |
HValue* checked_key, |
HValue* val, |
+ HValue* dependency, |
ElementsKind elements_kind, |
bool is_store) { |
if (is_store) { |
@@ -5752,7 +5754,7 @@ HInstruction* HGraphBuilder::BuildExternalArrayElementAccess( |
} else { |
ASSERT(val == NULL); |
return new(zone()) HLoadKeyedSpecializedArrayElement( |
- external_elements, checked_key, elements_kind); |
+ external_elements, checked_key, dependency, elements_kind); |
} |
} |
@@ -5760,6 +5762,7 @@ HInstruction* HGraphBuilder::BuildExternalArrayElementAccess( |
HInstruction* HGraphBuilder::BuildFastElementAccess(HValue* elements, |
HValue* checked_key, |
HValue* val, |
+ HValue* load_dependency, |
ElementsKind elements_kind, |
bool is_store) { |
if (is_store) { |
@@ -5788,10 +5791,11 @@ HInstruction* HGraphBuilder::BuildFastElementAccess(HValue* elements, |
OMIT_HOLE_CHECK : |
PERFORM_HOLE_CHECK; |
if (IsFastDoubleElementsKind(elements_kind)) { |
- return new(zone()) HLoadKeyedFastDoubleElement(elements, checked_key, mode); |
+ return new(zone()) HLoadKeyedFastDoubleElement(elements, checked_key, |
+ load_dependency, mode); |
} else { // Smi or Object elements. |
return new(zone()) HLoadKeyedFastElement(elements, checked_key, |
- elements_kind); |
+ load_dependency, elements_kind); |
} |
} |
@@ -5847,8 +5851,9 @@ HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess( |
HLoadExternalArrayPointer* external_elements = |
new(zone()) HLoadExternalArrayPointer(elements); |
AddInstruction(external_elements); |
- return BuildExternalArrayElementAccess(external_elements, checked_key, |
- val, map->elements_kind(), is_store); |
+ return BuildExternalArrayElementAccess( |
+ external_elements, checked_key, val, mapcheck, |
+ map->elements_kind(), is_store); |
} |
ASSERT(fast_smi_only_elements || |
fast_elements || |
@@ -5860,7 +5865,7 @@ HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess( |
length = AddInstruction(new(zone()) HFixedArrayBaseLength(elements)); |
} |
checked_key = AddInstruction(new(zone()) HBoundsCheck(key, length)); |
- return BuildFastElementAccess(elements, checked_key, val, |
+ return BuildFastElementAccess(elements, checked_key, val, mapcheck, |
map->elements_kind(), is_store); |
} |
@@ -6080,7 +6085,8 @@ HValue* HGraphBuilder::HandlePolymorphicElementAccess(HValue* object, |
HType::Smi())); |
checked_key = AddInstruction(new(zone()) HBoundsCheck(key, length)); |
access = AddInstruction(BuildFastElementAccess( |
- elements, checked_key, val, elements_kind, is_store)); |
+ elements, checked_key, val, elements_kind_branch, |
+ elements_kind, is_store)); |
if (!is_store) { |
Push(access); |
} |
@@ -6095,7 +6101,8 @@ HValue* HGraphBuilder::HandlePolymorphicElementAccess(HValue* object, |
length = AddInstruction(new(zone()) HFixedArrayBaseLength(elements)); |
checked_key = AddInstruction(new(zone()) HBoundsCheck(key, length)); |
access = AddInstruction(BuildFastElementAccess( |
- elements, checked_key, val, elements_kind, is_store)); |
+ elements, checked_key, val, elements_kind_branch, |
+ elements_kind, is_store)); |
} else if (elements_kind == DICTIONARY_ELEMENTS) { |
if (is_store) { |
access = AddInstruction(BuildStoreKeyedGeneric(object, key, val)); |
@@ -6104,7 +6111,8 @@ HValue* HGraphBuilder::HandlePolymorphicElementAccess(HValue* object, |
} |
} else { // External array elements. |
access = AddInstruction(BuildExternalArrayElementAccess( |
- external_elements, checked_key, val, elements_kind, is_store)); |
+ external_elements, checked_key, val, elements_kind_branch, |
+ elements_kind, is_store)); |
} |
*has_side_effects |= access->HasObservableSideEffects(); |
if (position != RelocInfo::kNoPosition) access->set_position(position); |