Separates the ADD binary operation into two separate operations,
one for string append and one for numeric addition.
Review by: scottb
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@5994 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JBinaryOperator.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JBinaryOperator.java
index 1922711..e4a18fc 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JBinaryOperator.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JBinaryOperator.java
@@ -24,11 +24,10 @@
// Don't renumber precs without checking implementation of isShiftOperator()
- MUL("*", 3), DIV("/", 3), MOD("%", 3), ADD("+", 4), SUB("-", 4), SHL("<<", 5), SHR(
+ MUL("*", 3), DIV("/", 3), MOD("%", 3), ADD("+", 4), CONCAT("+", 4), SUB("-", 4), SHL("<<", 5), SHR(
">>", 5), SHRU(">>>", 5), LT("<", 6), LTE("<=", 6), GT(">", 6), GTE(">=",
6), EQ("==", 7), NEQ("!=", 7), BIT_AND("&", 8), BIT_XOR("^", 9), BIT_OR(
- "|", 10), AND("&&", 11), OR("||", 12), ASG("=", 14), ASG_ADD("+=", 14,
- ADD), ASG_SUB("-=", 14, SUB), ASG_MUL("*=", 14, MUL), ASG_DIV("/=", 14,
+ "|", 10), AND("&&", 11), OR("||", 12), ASG("=", 14), ASG_ADD("+=", 14, ADD), ASG_CONCAT("+=", 14, CONCAT), ASG_SUB("-=", 14, SUB), ASG_MUL("*=", 14, MUL), ASG_DIV("/=", 14,
DIV), ASG_MOD("%=", 14, MOD), ASG_SHL("<<=", 14, SHL), ASG_SHR(">>=", 14,
SHR), ASG_SHRU(">>>=", 14, SHRU), ASG_BIT_AND("&=", 14, BIT_AND), ASG_BIT_OR(
"|=", 14, BIT_OR), ASG_BIT_XOR("^=", 14, BIT_XOR);
@@ -68,6 +67,7 @@
return precedence == 5 || (nonAsg != null && nonAsg.precedence == 5);
}
+ @Override
public String toString() {
return new String(getSymbol());
}
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/CastNormalizer.java b/dev/core/src/com/google/gwt/dev/jjs/impl/CastNormalizer.java
index 1319526..4296607 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/CastNormalizer.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/CastNormalizer.java
@@ -329,24 +329,20 @@
@Override
public void endVisit(JBinaryOperation x, Context ctx) {
- if (x.getType() != program.getTypeJavaLangString()) {
- return;
- }
-
- if (x.getOp() == JBinaryOperator.ADD) {
+ if (x.getOp() == JBinaryOperator.CONCAT) {
JExpression newLhs = convertString(x.getLhs());
JExpression newRhs = convertString(x.getRhs());
if (newLhs != x.getLhs() || newRhs != x.getRhs()) {
JBinaryOperation newExpr = new JBinaryOperation(x.getSourceInfo(),
- program.getTypeJavaLangString(), JBinaryOperator.ADD, newLhs,
+ program.getTypeJavaLangString(), JBinaryOperator.CONCAT, newLhs,
newRhs);
ctx.replaceMe(newExpr);
}
- } else if (x.getOp() == JBinaryOperator.ASG_ADD) {
+ } else if (x.getOp() == JBinaryOperator.ASG_CONCAT) {
JExpression newRhs = convertString(x.getRhs());
if (newRhs != x.getRhs()) {
JBinaryOperation newExpr = new JBinaryOperation(x.getSourceInfo(),
- program.getTypeJavaLangString(), JBinaryOperator.ASG_ADD,
+ program.getTypeJavaLangString(), JBinaryOperator.ASG_CONCAT,
x.getLhs(), newRhs);
ctx.replaceMe(newExpr);
}
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java b/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java
index 906fba5..446a52e 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java
@@ -128,8 +128,7 @@
}
// special string concat handling
- if ((x.getOp() == JBinaryOperator.ADD || x.getOp() == JBinaryOperator.ASG_ADD)
- && x.getType() == program.getTypeJavaLangString()) {
+ if ((x.getOp() == JBinaryOperator.CONCAT || x.getOp() == JBinaryOperator.ASG_CONCAT)) {
rescueByConcat(x.getLhs().getType());
rescueByConcat(x.getRhs().getType());
} else if (x.getOp() == JBinaryOperator.ASG) {
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/DeadCodeElimination.java b/dev/core/src/com/google/gwt/dev/jjs/impl/DeadCodeElimination.java
index a8643a2..dfed1e2 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/DeadCodeElimination.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/DeadCodeElimination.java
@@ -155,12 +155,11 @@
simplifyEq(lhs, rhs, ctx, true);
break;
case ADD:
- if (x.getType() == program.getTypeJavaLangString()) {
- evalConcat(lhs, rhs, ctx);
- break;
- }
simplifyAdd(lhs, rhs, ctx, x.getType());
break;
+ case CONCAT:
+ evalConcat(lhs, rhs, ctx);
+ break;
case SUB:
simplifySub(lhs, rhs, ctx, x.getType());
break;
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaAST.java b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaAST.java
index 511f422..3b74a87 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaAST.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaAST.java
@@ -907,7 +907,11 @@
op = JBinaryOperator.SHRU;
break;
case BinaryExpression.PLUS:
- op = JBinaryOperator.ADD;
+ if (typeMap.get(x.resolvedType) == program.getTypeJavaLangString()) {
+ op = JBinaryOperator.CONCAT;
+ } else {
+ op = JBinaryOperator.ADD;
+ }
break;
case BinaryExpression.MINUS:
op = JBinaryOperator.SUB;
@@ -974,7 +978,11 @@
switch (x.operator) {
case CompoundAssignment.PLUS:
- op = JBinaryOperator.ASG_ADD;
+ if (typeMap.get(x.resolvedType) == program.getTypeJavaLangString()) {
+ op = JBinaryOperator.ASG_CONCAT;
+ } else {
+ op = JBinaryOperator.ASG_ADD;
+ }
break;
case CompoundAssignment.MINUS:
op = JBinaryOperator.ASG_SUB;
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
index 4acb98f..a42463c 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
@@ -1763,6 +1763,7 @@
bOpMap.put(JBinaryOperator.DIV, JsBinaryOperator.DIV);
bOpMap.put(JBinaryOperator.MOD, JsBinaryOperator.MOD);
bOpMap.put(JBinaryOperator.ADD, JsBinaryOperator.ADD);
+ bOpMap.put(JBinaryOperator.CONCAT, JsBinaryOperator.ADD);
bOpMap.put(JBinaryOperator.SUB, JsBinaryOperator.SUB);
bOpMap.put(JBinaryOperator.SHL, JsBinaryOperator.SHL);
bOpMap.put(JBinaryOperator.SHR, JsBinaryOperator.SHR);
@@ -1780,6 +1781,7 @@
bOpMap.put(JBinaryOperator.OR, JsBinaryOperator.OR);
bOpMap.put(JBinaryOperator.ASG, JsBinaryOperator.ASG);
bOpMap.put(JBinaryOperator.ASG_ADD, JsBinaryOperator.ASG_ADD);
+ bOpMap.put(JBinaryOperator.ASG_CONCAT, JsBinaryOperator.ASG_ADD);
bOpMap.put(JBinaryOperator.ASG_SUB, JsBinaryOperator.ASG_SUB);
bOpMap.put(JBinaryOperator.ASG_MUL, JsBinaryOperator.ASG_MUL);
bOpMap.put(JBinaryOperator.ASG_DIV, JsBinaryOperator.ASG_DIV);