package org.objectweb.asm.commons.cfg.tree; import org.objectweb.asm.commons.cfg.Block; import org.objectweb.asm.commons.cfg.tree.node.AbstractNode; import org.objectweb.asm.tree.AbstractInsnNode; import org.objectweb.asm.tree.MethodNode; import java.util.Arrays; import static org.objectweb.asm.tree.AbstractInsnNode.LABEL; /** * @author Tyler Sedlar */ public class NodeTree extends AbstractNode { private final MethodNode mn; public NodeTree(MethodNode mn) { super(null, null, -1, -1); this.mn = mn; } public NodeTree(Block block) { this(block.owner); } @Override public MethodNode method() { return mn; } @Override public void accept(NodeVisitor nv) { if (!nv.validate()) return; nv.visitCode(); for (AbstractNode node : this) accept(nv, node); nv.visitEnd(); } private void accept(NodeVisitor nv, AbstractNode n) { if (!nv.validate()) return; n.accept(nv); for (AbstractNode node : n) accept(nv, node); } @Override public AbstractInsnNode[] collapse() { AbstractInsnNode[] instructions = super.collapse(); int i = instructions.length > 1 && instructions[instructions.length - 2].type() == LABEL ? 2 : 1; return Arrays.copyOf(instructions, instructions.length - i); } }