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