heap jode needs to represent them git-svn-id: https://svn.code.sf.net/p/jode/code/trunk@1103 379699f6-c40d-0410-875b-85095c16579ebranch_1_1
parent
02522b5cef
commit
4d643e9cbf
@ -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); |
||||
} |
||||
} |
||||
|
Loading…
Reference in new issue