Chromium Code Reviews| Index: src/hydrogen.cc |
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
| index 559eca6e5847eb8d3503a1f2426a74e60d5c8026..9354266d768c656bfe5db0e1acb89d9cb5aedd04 100644 |
| --- a/src/hydrogen.cc |
| +++ b/src/hydrogen.cc |
| @@ -10914,29 +10914,35 @@ HValue* HGraphBuilder::BuildBinaryOperation( |
| } |
| // Convert left argument as necessary. |
| - if (left_type->Is(Type::Number()) && !is_strong(strength)) { |
| + if (!left_type->Is(Type::String())) { |
| DCHECK(right_type->Is(Type::String())); |
| - left = BuildNumberToString(left, left_type); |
| - } else if (!left_type->Is(Type::String())) { |
| - DCHECK(right_type->Is(Type::String())); |
| - HValue* function = AddLoadJSBuiltin( |
| - is_strong(strength) ? Builtins::STRING_ADD_RIGHT_STRONG |
| - : Builtins::STRING_ADD_RIGHT); |
| - Add<HPushArguments>(left, right); |
| - return AddUncasted<HInvokeFunction>(function, 2); |
| + if (is_strong(strength)) { |
| + // In strong mode, if the left hand side of an additition is a string, |
|
Jarin
2015/08/13 06:23:50
additition -> addition (Here and below.)
Benedikt Meurer
2015/08/13 06:31:13
Done.
|
| + // the right hand side must be a string too. |
| + left = BuildCheckString(left); |
| + } else if (left_type->Is(Type::Number())) { |
| + left = BuildNumberToString(left, left_type); |
| + } else { |
| + HValue* function = AddLoadJSBuiltin(Builtins::STRING_ADD_RIGHT); |
| + Add<HPushArguments>(left, right); |
| + return AddUncasted<HInvokeFunction>(function, 2); |
| + } |
| } |
| // Convert right argument as necessary. |
| - if (right_type->Is(Type::Number()) && !is_strong(strength)) { |
| + if (!right_type->Is(Type::String())) { |
| DCHECK(left_type->Is(Type::String())); |
| - right = BuildNumberToString(right, right_type); |
| - } else if (!right_type->Is(Type::String())) { |
| - DCHECK(left_type->Is(Type::String())); |
| - HValue* function = AddLoadJSBuiltin(is_strong(strength) |
| - ? Builtins::STRING_ADD_LEFT_STRONG |
| - : Builtins::STRING_ADD_LEFT); |
| - Add<HPushArguments>(left, right); |
| - return AddUncasted<HInvokeFunction>(function, 2); |
| + if (is_strong(strength)) { |
| + // In strong mode, if the right hand side of an additition is a string, |
| + // the left hand side must be a string too. |
| + right = BuildCheckString(right); |
| + } else if (right_type->Is(Type::Number())) { |
| + right = BuildNumberToString(right, right_type); |
| + } else { |
| + HValue* function = AddLoadJSBuiltin(Builtins::STRING_ADD_LEFT); |
| + Add<HPushArguments>(left, right); |
| + return AddUncasted<HInvokeFunction>(function, 2); |
| + } |
| } |
| // Fast paths for empty constant strings. |