001/***
002 * ASM: a very small and fast Java bytecode manipulation framework
003 * Copyright (c) 2000-2011 INRIA, France Telecom
004 * All rights reserved.
005 *
006 * Redistribution and use in source and binary forms, with or without
007 * modification, are permitted provided that the following conditions
008 * are met:
009 * 1. Redistributions of source code must retain the above copyright
010 *    notice, this list of conditions and the following disclaimer.
011 * 2. Redistributions in binary form must reproduce the above copyright
012 *    notice, this list of conditions and the following disclaimer in the
013 *    documentation and/or other materials provided with the distribution.
014 * 3. Neither the name of the copyright holders nor the names of its
015 *    contributors may be used to endorse or promote products derived from
016 *    this software without specific prior written permission.
017 *
018 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
020 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
021 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
022 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
023 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
024 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
025 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
026 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
027 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
028 * THE POSSIBILITY OF SUCH DAMAGE.
029 */
030package io.ebean.enhance.asm.tree;
031
032import io.ebean.enhance.asm.MethodVisitor;
033
034import java.util.Map;
035
036/**
037 * A node that represents a jump instruction. A jump instruction is an
038 * instruction that may jump to another instruction.
039 * 
040 * @author Eric Bruneton
041 */
042public class JumpInsnNode extends AbstractInsnNode {
043
044    /**
045     * The operand of this instruction. This operand is a label that designates
046     * the instruction to which this instruction may jump.
047     */
048    public LabelNode label;
049
050    /**
051     * Constructs a new {@link JumpInsnNode}.
052     * 
053     * @param opcode
054     *            the opcode of the type instruction to be constructed. This
055     *            opcode must be IFEQ, IFNE, IFLT, IFGE, IFGT, IFLE, IF_ICMPEQ,
056     *            IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE,
057     *            IF_ACMPEQ, IF_ACMPNE, GOTO, JSR, IFNULL or IFNONNULL.
058     * @param label
059     *            the operand of the instruction to be constructed. This operand
060     *            is a label that designates the instruction to which the jump
061     *            instruction may jump.
062     */
063    public JumpInsnNode(final int opcode, final LabelNode label) {
064        super(opcode);
065        this.label = label;
066    }
067
068    /**
069     * Sets the opcode of this instruction.
070     * 
071     * @param opcode
072     *            the new instruction opcode. This opcode must be IFEQ, IFNE,
073     *            IFLT, IFGE, IFGT, IFLE, IF_ICMPEQ, IF_ICMPNE, IF_ICMPLT,
074     *            IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ACMPEQ, IF_ACMPNE, GOTO,
075     *            JSR, IFNULL or IFNONNULL.
076     */
077    public void setOpcode(final int opcode) {
078        this.opcode = opcode;
079    }
080
081    @Override
082    public int getType() {
083        return JUMP_INSN;
084    }
085
086    @Override
087    public void accept(final MethodVisitor mv) {
088        mv.visitJumpInsn(opcode, label.getLabel());
089        acceptAnnotations(mv);
090    }
091
092    @Override
093    public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) {
094        return new JumpInsnNode(opcode, clone(label, labels))
095                .cloneAnnotations(this);
096    }
097}