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
-~----------~----~----~----~------~----~------~--~---

Reply via email to