0

In der ASM Tree API habe ich eine InsnList, die eine Liste von Anweisungen in einer Methode enthält.InslList in Basisblöcke aufteilen

Ich möchte dies in Basisblöcke aufteilen: eine Folge von Anweisungen, so dass jeder Befehl außer dem letzten genau einen Nachfolger hat, und dass kein Befehl außer dem ersten der Zielpunkt eines Sprungs sein kann.

Wie würde ich das erreichen?

Antwort

2

In Java werden 7+ Stack Frames in die Methode Opcodes einbezogen. Iterate durch die InsnList einer Methode und mache Blöcke durch jeden FrameInsn aufgeteilt.

Beispiel:

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