Revision: 5994 Author: [email protected] Date: Fri Aug 21 10:53:16 2009 Log: Separates the ADD binary operation into two separate operations, one for string append and one for numeric addition.
Review by: scottb http://code.google.com/p/google-web-toolkit/source/detail?r=5994 Modified: /trunk/dev/core/src/com/google/gwt/dev/jjs/ast/JBinaryOperator.java /trunk/dev/core/src/com/google/gwt/dev/jjs/impl/CastNormalizer.java /trunk/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java /trunk/dev/core/src/com/google/gwt/dev/jjs/impl/DeadCodeElimination.java /trunk/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaAST.java /trunk/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java ======================================= --- /trunk/dev/core/src/com/google/gwt/dev/jjs/ast/JBinaryOperator.java Tue Mar 18 19:17:40 2008 +++ /trunk/dev/core/src/com/google/gwt/dev/jjs/ast/JBinaryOperator.java Fri Aug 21 10:53:16 2009 @@ -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()); } ======================================= --- /trunk/dev/core/src/com/google/gwt/dev/jjs/impl/CastNormalizer.java Sun May 24 16:56:31 2009 +++ /trunk/dev/core/src/com/google/gwt/dev/jjs/impl/CastNormalizer.java Fri Aug 21 10:53:16 2009 @@ -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); } ======================================= --- /trunk/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java Tue Jul 28 13:23:31 2009 +++ /trunk/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java Fri Aug 21 10:53:16 2009 @@ -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) { ======================================= --- /trunk/dev/core/src/com/google/gwt/dev/jjs/impl/DeadCodeElimination.java Mon May 18 11:47:32 2009 +++ /trunk/dev/core/src/com/google/gwt/dev/jjs/impl/DeadCodeElimination.java Fri Aug 21 10:53:16 2009 @@ -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; ======================================= --- /trunk/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaAST.java Mon Jul 6 14:45:31 2009 +++ /trunk/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaAST.java Fri Aug 21 10:53:16 2009 @@ -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; ======================================= --- /trunk/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java Tue Aug 4 09:54:58 2009 +++ /trunk/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java Fri Aug 21 10:53:16 2009 @@ -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); --~--~---------~--~----~------------~-------~--~----~ http://groups.google.com/group/Google-Web-Toolkit-Contributors -~----------~----~----~----~------~----~------~--~---
