diff --git a/jode/test/CountOpcodes.java b/jode/test/CountOpcodes.java new file mode 100644 index 0000000..79a6d25 --- /dev/null +++ b/jode/test/CountOpcodes.java @@ -0,0 +1,99 @@ +import jode.bytecode.*; +import java.util.*; +import com.sun.java.util.collections.Iterator; + +public class CountOpcodes { + static int[] opcodeCount = new int[256]; + static int[] predsCount = new int[1024]; + static int[] succsCount = new int[1024]; + static Vector instructions = new Vector(73400); + + public static void handleBytecode(BytecodeInfo bc) { + for (Iterator i = bc.getInstructions().iterator(); i.hasNext();) { + Instruction instr = (Instruction) i.next(); + instructions.addElement(instr); + opcodeCount[instr.getOpcode()]++; + Instruction[] p = instr.getPreds(); + if (p == null) + predsCount[0]++; + else + predsCount[p.length]++; + + Instruction[] s = instr.getSuccs(); + if (s == null) + succsCount[0]++; + else + succsCount[s.length]++; + } + } + + public static void handlePackage(String pack) { + Enumeration subs = ClassInfo.getClassesAndPackages(pack); + while (subs.hasMoreElements()) { + String comp = (String) subs.nextElement(); + String full = pack + "." + comp; + if (ClassInfo.isPackage(full)) + handlePackage(full); + else { + ClassInfo clazz = ClassInfo.forName(full); + clazz.loadInfo(ClassInfo.FULLINFO); + MethodInfo[] ms = clazz.getMethods(); + for (int i=0; i < ms.length; i++) { + BytecodeInfo bc = ms[i].getBytecode(); + if (bc != null) + handleBytecode(bc); + } + } + } + } + + public static void main(String[] params) { + ClassInfo.setClassPath(params[0]); + Runtime runtime = Runtime.getRuntime(); + long free = runtime.freeMemory(); + long last; + do { + last = free; + runtime.gc(); + runtime.runFinalization(); + free = runtime.freeMemory(); + } while (free < last); + System.err.println("used before: "+(runtime.totalMemory()- free)); + long time = System.currentTimeMillis(); + handlePackage("com"); + System.err.println("Time used: "+(System.currentTimeMillis() - time)); + free = runtime.freeMemory(); + do { + last = free; + runtime.gc(); + runtime.runFinalization(); + free = runtime.freeMemory(); + } while (free < last); + System.err.println("used after: "+(runtime.totalMemory()- free)); + System.err.println("instruction count: "+instructions.size()); + for (int i=0; i< 256; i++) { + if (opcodeCount[i] > 0) + System.err.println("Opcode "+i+": \t ("+Opcodes.opcodeString[i]+")\t"+opcodeCount[i]); + } + int moreThanTwo = 0; + for (int i=0; i< predsCount.length; i++) { + if (predsCount[i] > 0) { + System.err.println("preds "+i+": \t"+predsCount[i]); + if (i>1) + moreThanTwo +=predsCount[i]; + } + } + System.err.println("preds >2: \t"+moreThanTwo); + + moreThanTwo = 0; + for (int i=0; i< succsCount.length; i++) { + if (succsCount[i] > 0) { + System.err.println("succs "+i+": \t"+succsCount[i]); + if (i>1) + moreThanTwo +=succsCount[i]; + } + } + System.err.println("succs >2: \t"+moreThanTwo); + } +} +