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

09-27 08:55