Revision: 10280
Author:   [email protected]
Date:     Mon Jun  6 05:55:44 2011
Log: Fix enum ordinalization black-listing for upcasts in new array initializers

Review at http://gwt-code-reviews.appspot.com/1449812

http://code.google.com/p/google-web-toolkit/source/detail?r=10280

Modified:
 /trunk/dev/core/src/com/google/gwt/dev/jjs/impl/ImplicitUpcastAnalyzer.java
 /trunk/dev/core/test/com/google/gwt/dev/jjs/impl/EnumOrdinalizerTest.java

=======================================
--- /trunk/dev/core/src/com/google/gwt/dev/jjs/impl/ImplicitUpcastAnalyzer.java Thu May 5 06:03:58 2011 +++ /trunk/dev/core/src/com/google/gwt/dev/jjs/impl/ImplicitUpcastAnalyzer.java Mon Jun 6 05:55:44 2011
@@ -25,6 +25,7 @@
 import com.google.gwt.dev.jjs.ast.JField;
 import com.google.gwt.dev.jjs.ast.JMethod;
 import com.google.gwt.dev.jjs.ast.JMethodCall;
+import com.google.gwt.dev.jjs.ast.JNewArray;
 import com.google.gwt.dev.jjs.ast.JParameter;
 import com.google.gwt.dev.jjs.ast.JPrimitiveType;
 import com.google.gwt.dev.jjs.ast.JProgram;
@@ -145,6 +146,16 @@
       }
     }
   }
+
+  @Override
+  public void endVisit(JNewArray x, Context ctx) {
+    JType elementType = x.getArrayType().getElementType();
+    if (x.initializers != null) {
+      for (JExpression init : x.initializers) {
+ processIfTypesNotEqual(init.getType(), elementType, x.getSourceInfo());
+      }
+    }
+  }

   @Override
   public void endVisit(JReturnStatement x, Context ctx) {
=======================================
--- /trunk/dev/core/test/com/google/gwt/dev/jjs/impl/EnumOrdinalizerTest.java Wed May 4 07:26:14 2011 +++ /trunk/dev/core/test/com/google/gwt/dev/jjs/impl/EnumOrdinalizerTest.java Mon Jun 6 05:55:44 2011
@@ -32,10 +32,6 @@
  * makes sense to test the output in this way.  Thus, we provide confidence
* that the AST is left in a coherent state, but it is not a complete test that
  * ordinalization has completed correctly in every respec.
- *
- * TODO(jbrosenberg): Provide a test to assert that ordinalization has completed
- * correctly, by inspecting the AST in detail, specifically for ordinal
- * replacements, after the EnumOrdinalizer completes.
  */
 public class EnumOrdinalizerTest extends OptimizerTestBase {
   @Override
@@ -801,6 +797,68 @@
     assertTrue(tracker.isVisited("test.EntryPoint$Fruit"));
     assertFalse(tracker.isOrdinalized("test.EntryPoint$Fruit"));
   }
+
+  public void testNotOrdinalizableImplicitUpcastMethodCallArgsNewArray()
+      throws UnableToCompleteException  {
+    EnumOrdinalizer.resetTracker();
+
+    setupFruitEnum();
+ addSnippetClassDecl("public static String getEnumString(Enum[] myEnumArray) {",
+                        "  String retString = \"\";",
+                        "  for (Enum myEnum : myEnumArray) {",
+                        "    retString += myEnum.name();",
+                        "  }",
+                        "  return retString;",
+                        "}");
+ optimize("void", "String stringFruits = getEnumString(new Enum[] {Fruit.APPLE, Fruit.ORANGE});");
+
+    EnumOrdinalizer.Tracker tracker = EnumOrdinalizer.getTracker();
+    assertTrue(tracker.isVisited("test.EntryPoint$Fruit"));
+    assertFalse(tracker.isOrdinalized("test.EntryPoint$Fruit"));
+  }
+
+  public void testNotOrdinalizableImplicitUpcastMethodCallVarArgs()
+      throws UnableToCompleteException  {
+    EnumOrdinalizer.resetTracker();
+
+    setupFruitEnum();
+ addSnippetClassDecl("public static String getEnumString(Enum...myEnumArray) {",
+                        "  String retString = \"\";",
+                        "  for (Enum myEnum : myEnumArray) {",
+                        "    retString += myEnum.name();",
+                        "  }",
+                        "  return retString;",
+                        "}");
+ optimize("void", "String stringFruits = getEnumString(Fruit.APPLE, Fruit.ORANGE);");
+
+    EnumOrdinalizer.Tracker tracker = EnumOrdinalizer.getTracker();
+    assertTrue(tracker.isVisited("test.EntryPoint$Fruit"));
+    assertFalse(tracker.isOrdinalized("test.EntryPoint$Fruit"));
+  }
+
+  public void testNotOrdinalizableImplicitUpcastNewArrayElements()
+      throws UnableToCompleteException  {
+    EnumOrdinalizer.resetTracker();
+
+    setupFruitEnum();
+ optimize("void", "Enum[] enums = new Enum[] {Fruit.APPLE, Fruit.ORANGE};");
+
+    EnumOrdinalizer.Tracker tracker = EnumOrdinalizer.getTracker();
+    assertTrue(tracker.isVisited("test.EntryPoint$Fruit"));
+    assertFalse(tracker.isOrdinalized("test.EntryPoint$Fruit"));
+  }
+
+  public void testNotOrdinalizableImplicitUpcastNewArrayArrayElements()
+      throws UnableToCompleteException  {
+    EnumOrdinalizer.resetTracker();
+
+    setupFruitEnum();
+ optimize("void", "Enum[][] enums = new Enum[][] {{Fruit.APPLE, Fruit.ORANGE},{Fruit.ORANGE, Fruit.APPLE}};");
+
+    EnumOrdinalizer.Tracker tracker = EnumOrdinalizer.getTracker();
+    assertTrue(tracker.isVisited("test.EntryPoint$Fruit"));
+    assertFalse(tracker.isOrdinalized("test.EntryPoint$Fruit"));
+  }

   public void testNotOrdinalizableImplicitUpcastJsniMethodBodyParams()
       throws UnableToCompleteException  {

--
http://groups.google.com/group/Google-Web-Toolkit-Contributors

Reply via email to