JLocalDeclarationStatements were erroneously keeping locals from being pruned. We can now correctly prune locals.
Found by: jlabanca, tobyr
Review by: tobyr
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@1563 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/Pruner.java b/dev/core/src/com/google/gwt/dev/jjs/impl/Pruner.java
index db93546..ec74d87 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/Pruner.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/Pruner.java
@@ -21,12 +21,14 @@
import com.google.gwt.dev.jjs.ast.JArrayType;
import com.google.gwt.dev.jjs.ast.JBinaryOperation;
import com.google.gwt.dev.jjs.ast.JBinaryOperator;
+import com.google.gwt.dev.jjs.ast.JBlock;
import com.google.gwt.dev.jjs.ast.JClassType;
import com.google.gwt.dev.jjs.ast.JExpression;
import com.google.gwt.dev.jjs.ast.JField;
import com.google.gwt.dev.jjs.ast.JFieldRef;
import com.google.gwt.dev.jjs.ast.JInterfaceType;
import com.google.gwt.dev.jjs.ast.JLocal;
+import com.google.gwt.dev.jjs.ast.JLocalDeclarationStatement;
import com.google.gwt.dev.jjs.ast.JLocalRef;
import com.google.gwt.dev.jjs.ast.JMethod;
import com.google.gwt.dev.jjs.ast.JMethodBody;
@@ -111,6 +113,35 @@
}
@Override
+ public void endVisit(JMethod x, Context ctx) {
+ JType type = x.getType();
+ if (type instanceof JReferenceType) {
+ if (!program.typeOracle.isInstantiatedType((JReferenceType) type)) {
+ x.setType(program.getTypeNull());
+ }
+ }
+ }
+
+ public void endVisit(JLocalDeclarationStatement x, Context ctx) {
+ // The variable may have been pruned.
+ if (!referencedNonTypes.contains(x.getLocalRef().getTarget())) {
+ // If there is an initializer, just replace with that.
+ if (x.getInitializer() != null) {
+ ctx.replaceMe(x.getInitializer().makeStatement());
+ } else {
+ // No initializer, prune this entirely.
+ if (ctx.canRemove()) {
+ // Just remove it if we can.
+ ctx.removeMe();
+ } else {
+ // Replace with empty block.
+ ctx.replaceMe(new JBlock(program, x.getSourceInfo()));
+ }
+ }
+ }
+ }
+
+ @Override
public void endVisit(JMethodCall x, Context ctx) {
JMethod method = x.getTarget();
@@ -160,16 +191,6 @@
ctx.replaceMe(newCall);
}
}
-
- @Override
- public void endVisit(JMethod x, Context ctx) {
- JType type = x.getType();
- if (type instanceof JReferenceType) {
- if (!program.typeOracle.isInstantiatedType((JReferenceType) type)) {
- x.setType(program.getTypeNull());
- }
- }
- }
}
/**
@@ -282,22 +303,17 @@
ArrayList<JParameter> removedParams = new ArrayList<JParameter>(
x.params);
- for (int i = 0; i < x.params.size(); i++) {
+ for (int i = 0; i < x.params.size(); ++i) {
JParameter param = x.params.get(i);
-
if (!referencedNonTypes.contains(param)) {
x.params.remove(i);
-
didChange = true;
-
removedMethodParamsMap.put(x, removedParams);
-
// Remove the associated JSNI parameter
if (func != null) {
func.getParameters().remove(i);
}
-
- i--;
+ --i;
}
}
}
@@ -525,6 +541,17 @@
return false;
}
+ public boolean visit(JLocalDeclarationStatement x, Context ctx) {
+ /*
+ * A declaration by itself doesn't rescue a local (even if it has an
+ * initializer). Writes don't count, only reads.
+ */
+ if (x.getInitializer() != null) {
+ accept(x.getInitializer());
+ }
+ return false;
+ }
+
@Override
public boolean visit(JLocalRef ref, Context ctx) {
JLocal target = ref.getLocal();