Fixes a problem in type pruning where removing a type would cause it to skip the next type.  Also early-outs method upref rescue.

Suggested by: alex.tkachman
Review by: mmendez


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@1035 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 47a6d17..984b31f 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
@@ -182,13 +182,13 @@
 
     // @Override
     public boolean visit(JProgram program, Context ctx) {
-      for (int i = 0; i < program.getDeclaredTypes().size(); ++i) {
-        JReferenceType type = (JReferenceType) program.getDeclaredTypes().get(i);
+      for (Iterator it = program.getDeclaredTypes().iterator(); it.hasNext(); ) {
+        JReferenceType type = (JReferenceType) it.next();
         if (referencedTypes.contains(type)
             || program.typeOracle.isInstantiatedType(type)) {
           accept(type);
         } else {
-          program.getDeclaredTypes().remove(type);
+          it.remove();
           didChange = true;
         }
       }
@@ -619,14 +619,18 @@
       for (int i = 0; i < x.overrides.size(); ++i) {
         JMethod ref = (JMethod) x.overrides.get(i);
         if (referencedNonTypes.contains(ref)) {
-          didRescue |= rescuer.rescue(x);
+          rescuer.rescue(x);
+          didRescue = true;
+          return false;
         }
       }
       JMethod[] virtualOverrides = program.typeOracle.getAllVirtualOverrides(x);
       for (int i = 0; i < virtualOverrides.length; ++i) {
         JMethod ref = virtualOverrides[i];
         if (referencedNonTypes.contains(ref)) {
-          didRescue |= rescuer.rescue(x);
+          rescuer.rescue(x);
+          didRescue = true;
+          return false;
         }
       }
       return false;