将 InsnList 拆分为基本块

Splitting InsnList into basic blocks

在 ASM 树 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);
    }
}