Index: src/compiler/js-typed-lowering.cc |
diff --git a/src/compiler/js-typed-lowering.cc b/src/compiler/js-typed-lowering.cc |
index 869096232ffac2c1d3d93f1474068f8d308add49..9f1e7eb8914b5ae824a080718fcebee55c70d58a 100644 |
--- a/src/compiler/js-typed-lowering.cc |
+++ b/src/compiler/js-typed-lowering.cc |
@@ -222,14 +222,23 @@ class JSBinopReduction { |
Reduction JSTypedLowering::ReduceJSAdd(Node* node) { |
JSBinopReduction r(this, node); |
- if (r.OneInputIs(Type::String())) { |
- r.ConvertInputsToString(); |
- return r.ChangeToPureOperator(simplified()->StringAdd()); |
+ if (r.BothInputsAre(Type::Number())) { |
+ // JSAdd(x:number, y:number) => NumberAdd(x, y) |
+ return r.ChangeToPureOperator(simplified()->NumberAdd()); |
} |
- if (r.NeitherInputCanBe(Type::String())) { |
+ Type* maybe_string = Type::Union(Type::String(), Type::Receiver(), zone()); |
+ if (r.NeitherInputCanBe(maybe_string)) { |
+ // JSAdd(x:-string, y:-string) => NumberAdd(ToNumber(x), ToNumber(y)) |
Michael Starzinger
2014/09/11 14:25:44
I convinced myself that this is correct for ES5, c
rossberg
2014/09/11 14:50:19
It seems correct, as long as ToNumber(symbol) thro
|
r.ConvertInputsToNumber(); |
return r.ChangeToPureOperator(simplified()->NumberAdd()); |
} |
+ if (r.OneInputIs(Type::String())) { |
+ // JSAdd(x:string, y:string) => StringAdd(x, y) |
+ // JSAdd(x:string, y) => StringAdd(x, ToString(y)) |
+ // JSAdd(x, y:string) => StringAdd(ToString(x), y) |
+ r.ConvertInputsToString(); |
+ return r.ChangeToPureOperator(simplified()->StringAdd()); |
+ } |
return NoChange(); |
} |