Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index 9007d0903b5b7d92f262ac3c6e70c22000247745..e254005c8f21275374face245147baf60f153400 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -4888,10 +4888,21 @@ HStringCharCodeAt* HGraphBuilder::BuildStringCharCodeAt(HValue* string, |
HInstruction* HGraphBuilder::BuildBinaryOperation(BinaryOperation* expr, |
HValue* left, |
HValue* right) { |
+ TypeInfo info = oracle()->BinaryType(expr); |
HInstruction* instr = NULL; |
switch (expr->op()) { |
case Token::ADD: |
- instr = new(zone()) HAdd(left, right); |
+ if (info.IsString()) { |
+ AddInstruction(new(zone()) HCheckNonSmi(left)); |
+ AddInstruction(new(zone()) HCheckInstanceType( |
+ left, FIRST_STRING_TYPE, LAST_STRING_TYPE)); |
+ AddInstruction(new(zone()) HCheckNonSmi(right)); |
+ AddInstruction(new(zone()) HCheckInstanceType( |
+ right, FIRST_STRING_TYPE, LAST_STRING_TYPE)); |
+ instr = new(zone()) HStringAdd(left, right); |
+ } else { |
+ instr = new(zone()) HAdd(left, right); |
+ } |
break; |
case Token::SUB: |
instr = new(zone()) HSub(left, right); |
@@ -4926,7 +4937,6 @@ HInstruction* HGraphBuilder::BuildBinaryOperation(BinaryOperation* expr, |
default: |
UNREACHABLE(); |
} |
- TypeInfo info = oracle()->BinaryType(expr); |
// If we hit an uninitialized binary op stub we will get type info |
// for a smi operation. If one of the operands is a constant string |
// do not generate code assuming it is a smi operation. |