Reviewers: cromwellian, zundel,
Description:
Fix enum ordinalization black-listing for upcasts in new array
initializers
Please review this at http://gwt-code-reviews.appspot.com/1449812/
Affected files:
M dev/core/src/com/google/gwt/dev/jjs/impl/ImplicitUpcastAnalyzer.java
M dev/core/test/com/google/gwt/dev/jjs/impl/EnumOrdinalizerTest.java
Index: dev/core/src/com/google/gwt/dev/jjs/impl/ImplicitUpcastAnalyzer.java
===================================================================
--- dev/core/src/com/google/gwt/dev/jjs/impl/ImplicitUpcastAnalyzer.java
(revision 10269)
+++ dev/core/src/com/google/gwt/dev/jjs/impl/ImplicitUpcastAnalyzer.java
(working copy)
@@ -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;
@@ -147,6 +148,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) {
if (x.getExpr() != null) {
// check against the current method return type
Index: dev/core/test/com/google/gwt/dev/jjs/impl/EnumOrdinalizerTest.java
===================================================================
--- dev/core/test/com/google/gwt/dev/jjs/impl/EnumOrdinalizerTest.java
(revision 10269)
+++ dev/core/test/com/google/gwt/dev/jjs/impl/EnumOrdinalizerTest.java
(working copy)
@@ -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
@@ -796,6 +792,68 @@
" return retString;",
"}");
optimize("void", "String stringApple = getEnumString(Fruit.APPLE);");
+
+ EnumOrdinalizer.Tracker tracker = EnumOrdinalizer.getTracker();
+ 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"));
--
http://groups.google.com/group/Google-Web-Toolkit-Contributors