i cant belive this works
[org.ibex.core.git] / src / org / ibex / util / BytecodePruner.java
index f9a3b64..a04a77a 100644 (file)
@@ -11,13 +11,13 @@ import org.apache.bcel.util.*;
 public class BytecodePruner {
 
     public static final boolean deleteMethods = false;
-
-    // FIXME
     public static SyntheticRepository repo = null;
-
     public static HashSet dest = new HashSet();
-
     public static String outdir = ".";
+    public static Hashtable subclasses = new Hashtable();
+    public static int level = 0;
+
+    public BytecodePruner() { }
 
     public void loadAllMethods(String classname) throws Exception {
         visitJavaClass(repo.loadClass(classname));
@@ -40,6 +40,7 @@ public class BytecodePruner {
     public void loadMethod(String classAndMethodName) throws Exception {
         String classname = classAndMethodName.substring(0, classAndMethodName.lastIndexOf('.'));
         String methodname = classAndMethodName.substring(classAndMethodName.lastIndexOf('.') + 1);
+        if (classname.endsWith("." + methodname)) methodname = "<init>";
         visitJavaClass(repo.loadClass(classname));
         Method[] meths = getMethods(repo.loadClass(classname));
         for(int i=0; i<meths.length; i++)
@@ -75,8 +76,6 @@ public class BytecodePruner {
         // we call start(), but the VM calls run()...
         bcp.loadMethod("java.lang.Thread.run");
         bcp.loadAllMethods("java.lang.SecurityContext");
-        //bcp.visitJavaClass(repo.loadClass("java.awt.AWTPermission"));
-        //bcp.visitJavaClass(repo.loadClass("gnu.classpath.Configuration"));
         bcp.loadAllMethods("java.lang.ThreadDeath");
 
         bcp.loadAllMethods("java.util.Hashtable$HashIterator");
@@ -125,8 +124,6 @@ public class BytecodePruner {
         }
     }
 
-    public BytecodePruner() { }
-
     public static void dump(JavaClass clazz) throws Exception {
         if (!dest.contains(clazz)) return;
 
@@ -150,10 +147,10 @@ public class BytecodePruner {
         int numMethods = 0;
         boolean good = false;
         for(int i=0; i<methods.length; i++) {
-            if (dest.contains(methods[i]) ||
-                clazz.getClassName().startsWith("java.io.FileDescriptor")
+            if (dest.contains(methods[i])
                 || clazz.getClassName().startsWith("gnu.gcj.runtime.")
-                || clazz.getClassName().startsWith("java.lang.")
+                || (clazz.getClassName().startsWith("java.lang.") &&
+                    !(clazz.getClassName().equals("java.lang.System") && methods[i].getName().equals("runFinalizersOnExit")))
                 ) {
                 if (!methods[i].getName().equals("<clinit>")) good = true;
             } else {
@@ -217,13 +214,7 @@ public class BytecodePruner {
         load(((ObjectType)t).getClassName());
     }
 
-    // hashtable of hashsets
-    public static Hashtable subclasses = new Hashtable();
-
-    public String getMethodSignature(Method m, ConstantPoolGen cpg) throws Exception {
-        return m.getName() + m.getSignature();
-    }
-
+    public String getMethodSignature(Method m, ConstantPoolGen cpg) throws Exception { return m.getName() + m.getSignature(); }
     public String getMethodSignature(InvokeInstruction ii, ConstantPoolGen cpg) throws Exception {
         String sig = "";
         Type[] argtypes = ii.getArgumentTypes(cpg);
@@ -231,23 +222,15 @@ public class BytecodePruner {
         return ii.getMethodName(cpg) + "(" + sig + ")" + ii.getReturnType(cpg).getSignature();
     }
 
-    public static int level = 0;
     public void visitJavaMethod(JavaClass jc, Method method) throws Exception {
         visitJavaClass(jc);
-        /*
-        if (jc.getClassName().equals("java.util.Date") && method.getName().equals("readObject")) return;
-        */
         if (jc.getClassName().indexOf("SharedLib") != -1) return;
         if (jc.getClassName().indexOf("Datagram") != -1) return;
-        if (dest.contains(method)) return;
 
-        /*
-        // HACK (okay?)
-        // not inferrable: CNI call to abstract method
-        if (jc.getClassName().equals("java.util.TimeZone") && method.getName().equals("getDefaultTimeZoneId"))
-            loadMethod("java.util.SimpleTimeZone.useDaylightTime");
-        */
-        
+        // gcj bug; gcj can't compile this method from a .class file input; I have no idea why
+        if (jc.getClassName().equals("java.lang.System") && method.getName().equals("runFinalizersOnExit")) return;
+
+        if (dest.contains(method)) return;
         dest.add(method);
         level += 2;
         for(int i=0; i<level; i++) System.out.print(" ");
@@ -299,6 +282,7 @@ public class BytecodePruner {
             }
         }
         level -= 2;
+        // FIXME: move this to the top
         load(method.getReturnType());
         Type[] argtypes = method.getArgumentTypes();
         for(int i=0; i<argtypes.length; i++) load(argtypes[i]);
@@ -333,8 +317,8 @@ public class BytecodePruner {
             ((HashSet)subclasses.get(interfaces[i])).add(clazz);
         }
 
-        if (clazz.getClassName().startsWith("org.ibex."))
-            loadAllMethods(clazz.getClassName());
+        // FIXME
+        if (clazz.getClassName().startsWith("org.ibex.")) loadAllMethods(clazz.getClassName());
 
         for(JavaClass sup = superclass; sup != null; sup = sup.getSuperClass()) {
             visitJavaClass(sup);
@@ -345,16 +329,9 @@ public class BytecodePruner {
             remarkMethods(interfaces[i], clazz, cpg);
         }
 
-        Field[] fields = clazz.getFields();
-        for(int i=0; i<fields.length; i++) {
-            if (!fields[i].isStatic())
-                visitJavaField(fields[i]);
-        }
-
         Method[] methods = getMethods(clazz);
         for(int i=0; i<methods.length; i++) {
             if (methods[i].getName().equals("<clinit>")) visitJavaMethod(clazz, methods[i]);
-            // only if ctor reachable (?)
             if (methods[i].getName().equals("equals")) visitJavaMethod(clazz, methods[i]);
             if (methods[i].getName().equals("hashCode")) visitJavaMethod(clazz, methods[i]);
             if (methods[i].getName().equals("finalize")) visitJavaMethod(clazz, methods[i]);