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