1 30 package org.objectweb.asm; 31 32 import org.apache.bcel.Constants; 33 import org.apache.bcel.classfile.ClassParser; 34 import org.apache.bcel.classfile.JavaClass; 35 import org.apache.bcel.classfile.Method; 36 import org.apache.bcel.generic.ALOAD; 37 import org.apache.bcel.generic.ClassGen; 38 import org.apache.bcel.generic.ConstantPoolGen; 39 import org.apache.bcel.generic.FieldGen; 40 import org.apache.bcel.generic.GETFIELD; 41 import org.apache.bcel.generic.IADD; 42 import org.apache.bcel.generic.ICONST; 43 import org.apache.bcel.generic.InstructionHandle; 44 import org.apache.bcel.generic.InstructionList; 45 import org.apache.bcel.generic.MethodGen; 46 import org.apache.bcel.generic.PUTFIELD; 47 import org.apache.bcel.generic.Type; 48 49 import java.io.InputStream ; 50 51 54 public class BCELPerfTest extends ALLPerfTest implements Constants { 55 56 public static void main(final String args[]) throws Exception { 57 System.out.println("BCEL PERFORMANCES\n"); 58 new BCELPerfTest().perfs(args); 59 } 60 61 ALLPerfTest newInstance() { 62 return new BCELPerfTest(); 63 } 64 65 byte[] nullAdaptClass(final InputStream is, final String name) 66 throws Exception 67 { 68 JavaClass jc = new ClassParser(is, name + ".class").parse(); 69 ClassGen cg = new ClassGen(jc); 70 ConstantPoolGen cp = cg.getConstantPool(); 71 Method[] ms = cg.getMethods(); 72 for (int j = 0; j < ms.length; ++j) { 73 MethodGen mg = new MethodGen(ms[j], cg.getClassName(), cp); 74 boolean lv = ms[j].getLocalVariableTable() == null; 75 boolean ln = ms[j].getLineNumberTable() == null; 76 if (lv) { 77 mg.removeLocalVariables(); 78 } 79 if (ln) { 80 mg.removeLineNumbers(); 81 } 82 mg.stripAttributes(skipDebug); 83 InstructionList il = mg.getInstructionList(); 84 if (il != null) { 85 InstructionHandle ih = il.getStart(); 86 while (ih != null) { 87 ih = ih.getNext(); 88 } 89 if (compute) { 90 mg.setMaxStack(); 91 mg.setMaxLocals(); 92 } 93 } 94 cg.replaceMethod(ms[j], mg.getMethod()); 95 } 96 return cg.getJavaClass().getBytes(); 97 } 98 99 byte[] counterAdaptClass(final InputStream is, final String name) 100 throws Exception 101 { 102 JavaClass jc = new ClassParser(is, name + ".class").parse(); 103 ClassGen cg = new ClassGen(jc); 104 ConstantPoolGen cp = cg.getConstantPool(); 105 if (!cg.isInterface()) { 106 FieldGen fg = new FieldGen(ACC_PUBLIC, 107 Type.getType("I"), 108 "_counter", 109 cp); 110 cg.addField(fg.getField()); 111 } 112 Method[] ms = cg.getMethods(); 113 for (int j = 0; j < ms.length; ++j) { 114 MethodGen mg = new MethodGen(ms[j], cg.getClassName(), cp); 115 if (!mg.getName().equals("<init>") && !mg.isStatic() 116 && !mg.isAbstract() && !mg.isNative()) 117 { 118 if (mg.getInstructionList() != null) { 119 InstructionList il = new InstructionList(); 120 il.append(new ALOAD(0)); 121 il.append(new ALOAD(0)); 122 il.append(new GETFIELD(cp.addFieldref(name, "_counter", "I"))); 123 il.append(new ICONST(1)); 124 il.append(new IADD()); 125 il.append(new PUTFIELD(cp.addFieldref(name, "_counter", "I"))); 126 mg.getInstructionList().insert(il); 127 mg.setMaxStack(Math.max(mg.getMaxStack(), 2)); 128 boolean lv = ms[j].getLocalVariableTable() == null; 129 boolean ln = ms[j].getLineNumberTable() == null; 130 if (lv) { 131 mg.removeLocalVariables(); 132 } 133 if (ln) { 134 mg.removeLineNumbers(); 135 } 136 cg.replaceMethod(ms[j], mg.getMethod()); 137 } 138 } 139 } 140 return cg.getJavaClass().getBytes(); 141 } 142 } 143 | Popular Tags |