在ASM Tree API中,我有一个InsnList,其中包含方法中的指令列表。
我想将其分为几个基本块:一系列指令,使得除最后一条指令外的每个指令都具有一个后继,而除第一个指令外的其他指令均不能成为跳转的目标。
我将如何完成?
最佳答案
在Java 7+中,堆栈帧将包含在方法操作码中。遍历方法的InsnList并使每个FrameInsn拆分块。
例:
List<InsnList> l = Lists.newList();
InsnList il = new InsnList();
for (AbstractInsnNode ain : method.instructions.toArray()) {
if (ain.getType == AbstractInsnNode.FRAME){
l.add(il);
il = new InsnList();
} else {
il.add(ain);
}
}