| Index: src/hydrogen.cc
|
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc
|
| index 3b232e6e93ee2d307e5ea9504266825fb9f11b36..5f78cabe0f6b97d83f79fe56e1765c91baa0d056 100644
|
| --- a/src/hydrogen.cc
|
| +++ b/src/hydrogen.cc
|
| @@ -7830,14 +7830,27 @@ HInstruction* HGraphBuilder::BuildBinaryOperation(
|
| // Special case for string addition here.
|
| if (op == Token::ADD &&
|
| (left_type->Is(Type::String()) || right_type->Is(Type::String()))) {
|
| + // Validate type feedback for left argument.
|
| if (left_type->Is(Type::String())) {
|
| IfBuilder if_isstring(this);
|
| if_isstring.If<HIsStringAndBranch>(left);
|
| if_isstring.Then();
|
| if_isstring.ElseDeopt("Expected string for LHS of binary operation");
|
| - } else if (left_type->Is(Type::Number())) {
|
| + }
|
| +
|
| + // Validate type feedback for right argument.
|
| + if (right_type->Is(Type::String())) {
|
| + IfBuilder if_isstring(this);
|
| + if_isstring.If<HIsStringAndBranch>(right);
|
| + if_isstring.Then();
|
| + if_isstring.ElseDeopt("Expected string for RHS of binary operation");
|
| + }
|
| +
|
| + // Convert left argument as necessary.
|
| + if (left_type->Is(Type::Number())) {
|
| + ASSERT(right_type->Is(Type::String()));
|
| left = BuildNumberToString(left, left_type);
|
| - } else {
|
| + } else if (!left_type->Is(Type::String())) {
|
| ASSERT(right_type->Is(Type::String()));
|
| HValue* function = AddLoadJSBuiltin(Builtins::STRING_ADD_RIGHT);
|
| Add<HPushArgument>(left);
|
| @@ -7845,14 +7858,11 @@ HInstruction* HGraphBuilder::BuildBinaryOperation(
|
| return NewUncasted<HInvokeFunction>(function, 2);
|
| }
|
|
|
| - if (right_type->Is(Type::String())) {
|
| - IfBuilder if_isstring(this);
|
| - if_isstring.If<HIsStringAndBranch>(right);
|
| - if_isstring.Then();
|
| - if_isstring.ElseDeopt("Expected string for RHS of binary operation");
|
| - } else if (right_type->Is(Type::Number())) {
|
| + // Convert right argument as necessary.
|
| + if (right_type->Is(Type::Number())) {
|
| + ASSERT(left_type->Is(Type::String()));
|
| right = BuildNumberToString(right, right_type);
|
| - } else {
|
| + } else if (!right_type->Is(Type::String())) {
|
| ASSERT(left_type->Is(Type::String()));
|
| HValue* function = AddLoadJSBuiltin(Builtins::STRING_ADD_LEFT);
|
| Add<HPushArgument>(left);
|
|
|