67 lines
2.0 KiB
Java
67 lines
2.0 KiB
Java
package bytecode.stackmaptable;
|
|
|
|
import junit.framework.TestCase;
|
|
import org.apache.bcel.Repository;
|
|
import org.apache.bcel.classfile.*;
|
|
import org.apache.bcel.generic.ConstantPoolGen;
|
|
import org.apache.bcel.generic.MethodGen;
|
|
import org.apache.bcel.generic.StackMapTableGen;
|
|
|
|
import java.util.List;
|
|
|
|
public class StackMapTableGenTests extends TestCase {
|
|
|
|
public static class StackMapTableTest {
|
|
public void method1(){}
|
|
|
|
Integer method2(Boolean b){
|
|
if(b){
|
|
return 1;
|
|
}else{
|
|
return 2;
|
|
}
|
|
}
|
|
|
|
public static void staticMethod1(){
|
|
int a = 1;
|
|
int b = 2;
|
|
while(true){
|
|
a = b;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
private MethodGen getMethod(Class<?> cls, String name) throws ClassNotFoundException {
|
|
JavaClass jc = Repository.lookupClass(cls);
|
|
ConstantPoolGen cp = new ConstantPoolGen(jc.getConstantPool());
|
|
for (Method method : jc.getMethods()) {
|
|
if (method.getName().equals(name)) {
|
|
return new MethodGen(method, jc.getClassName(), cp);
|
|
}
|
|
}
|
|
|
|
fail("Method " + name + " not found in class " + cls);
|
|
return null;
|
|
}
|
|
|
|
public void testFrameSplittingTrivial() throws Exception{
|
|
MethodGen mg = getMethod(StackMapTableTest.class, "method1");
|
|
StackMapTableGen sg = new StackMapTableGen(mg,mg.getConstantPool());
|
|
List blocks = sg.splitIntoBlocks(mg.getInstructionList(), mg.getConstantPool());
|
|
assertTrue(blocks.size() == 1); //There is only one frame, because the method1 is empty
|
|
}
|
|
|
|
public void testStaticMethods() throws Exception{
|
|
MethodGen mg = getMethod(StackMapTableTest.class, "staticMethod1");
|
|
StackMapTableGen sg = new StackMapTableGen(mg,mg.getConstantPool());
|
|
try{
|
|
StackMap stackMap = sg.getStackMap();
|
|
assertTrue(stackMap.getStackMap().length > 0);
|
|
}catch(Exception e){
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
}
|