Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index 3ddd7cce83d1fb7464cf2c476324731ae0dff23f..9f3945f275dd8cfaacbc9c4a5aca0a5d70a2b9d3 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -8800,6 +8800,12 @@ HValue* HOptimizedGraphBuilder::BuildArrayIndexOf(HValue* receiver, |
Push(graph()->GetConstantMinus1()); |
if (IsFastDoubleElementsKind(kind) || IsFastSmiElementsKind(kind)) { |
+ // Make sure that we can actually compare numbers correctly below, see |
+ // https://code.google.com/p/chromium/issues/detail?id=407946 for details. |
+ search_element = AddUncasted<HForceRepresentation>( |
+ search_element, IsFastSmiElementsKind(kind) ? Representation::Smi() |
+ : Representation::Double()); |
+ |
LoopBuilder loop(this, context(), direction); |
{ |
HValue* index = loop.BeginBody(initial, terminating, token); |
@@ -8807,12 +8813,8 @@ HValue* HOptimizedGraphBuilder::BuildArrayIndexOf(HValue* receiver, |
elements, index, static_cast<HValue*>(NULL), |
kind, ALLOW_RETURN_HOLE); |
IfBuilder if_issame(this); |
- if (IsFastDoubleElementsKind(kind)) { |
- if_issame.If<HCompareNumericAndBranch>( |
- element, search_element, Token::EQ_STRICT); |
- } else { |
- if_issame.If<HCompareObjectEqAndBranch>(element, search_element); |
- } |
+ if_issame.If<HCompareNumericAndBranch>(element, search_element, |
+ Token::EQ_STRICT); |
if_issame.Then(); |
{ |
Drop(1); |