在 ASM Tree API 中,我有一个 InsnList,其中包含方法中的指令列表。
我想将其分解为基本块:一系列指令,使得除了最后一条指令之外的每条指令都有一个后继指令,并且除了第一条指令之外的任何指令都不能成为跳转的目标。
我将如何做到这一点?
在 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);
}
}