1674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen/***
2674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * ASM: a very small and fast Java bytecode manipulation framework
3674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Copyright (c) 2000-2007 INRIA, France Telecom
4674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * All rights reserved.
5674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *
6674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Redistribution and use in source and binary forms, with or without
7674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * modification, are permitted provided that the following conditions
8674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * are met:
9674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 1. Redistributions of source code must retain the above copyright
10674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *    notice, this list of conditions and the following disclaimer.
11674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 2. Redistributions in binary form must reproduce the above copyright
12674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *    notice, this list of conditions and the following disclaimer in the
13674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *    documentation and/or other materials provided with the distribution.
14674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 3. Neither the name of the copyright holders nor the names of its
15674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *    contributors may be used to endorse or promote products derived from
16674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *    this software without specific prior written permission.
17674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *
18674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
22674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
28674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * THE POSSIBILITY OF SUCH DAMAGE.
29674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */
30674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenpackage org.mockito.asm.tree;
31674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
32674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport java.util.List;
33674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport java.util.Map;
34674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
35674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.MethodVisitor;
36674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
37674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen/**
38674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * A node that represents a bytecode instruction. <i>An instruction can appear
39674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * at most once in at most one {@link InsnList} at a time</i>.
40674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *
41674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @author Eric Bruneton
42674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */
43674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenpublic abstract class AbstractInsnNode {
44674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
45674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
46674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The type of {@link InsnNode} instructions.
47674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
48674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public static final int INSN = 0;
49674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
50674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
51674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The type of {@link IntInsnNode} instructions.
52674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
53674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public static final int INT_INSN = 1;
54674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
55674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
56674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The type of {@link VarInsnNode} instructions.
57674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
58674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public static final int VAR_INSN = 2;
59674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
60674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
61674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The type of {@link TypeInsnNode} instructions.
62674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
63674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public static final int TYPE_INSN = 3;
64674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
65674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
66674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The type of {@link FieldInsnNode} instructions.
67674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
68674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public static final int FIELD_INSN = 4;
69674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
70674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
71674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The type of {@link MethodInsnNode} instructions.
72674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
73674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public static final int METHOD_INSN = 5;
74674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
75674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
76674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The type of {@link JumpInsnNode} instructions.
77674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
78674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public static final int JUMP_INSN = 6;
79674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
80674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
81674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The type of {@link LabelNode} "instructions".
82674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
83674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public static final int LABEL = 7;
84674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
85674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
86674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The type of {@link LdcInsnNode} instructions.
87674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
88674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public static final int LDC_INSN = 8;
89674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
90674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
91674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The type of {@link IincInsnNode} instructions.
92674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
93674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public static final int IINC_INSN = 9;
94674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
95674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
96674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The type of {@link TableSwitchInsnNode} instructions.
97674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
98674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public static final int TABLESWITCH_INSN = 10;
99674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
100674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
101674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The type of {@link LookupSwitchInsnNode} instructions.
102674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
103674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public static final int LOOKUPSWITCH_INSN = 11;
104674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
105674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
106674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The type of {@link MultiANewArrayInsnNode} instructions.
107674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
108674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public static final int MULTIANEWARRAY_INSN = 12;
109674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
110674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
111674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The type of {@link FrameNode} "instructions".
112674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
113674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public static final int FRAME = 13;
114674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
115674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
116674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The type of {@link LineNumberNode} "instructions".
117674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
118674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public static final int LINE = 14;
119674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
120674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
121674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The opcode of this instruction.
122674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
123674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    protected int opcode;
124674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
125674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
126674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Previous instruction in the list to which this instruction belongs.
127674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
128674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    AbstractInsnNode prev;
129674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
130674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
131674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Next instruction in the list to which this instruction belongs.
132674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
133674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    AbstractInsnNode next;
134674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
135674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
136674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Index of this instruction in the list to which it belongs. The value of
137674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * this field is correct only when {@link InsnList#cache} is not null. A
138674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * value of -1 indicates that this instruction does not belong to any
139674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * {@link InsnList}.
140674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
141674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    int index;
142674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
143674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
144674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Constructs a new {@link AbstractInsnNode}.
145674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
146674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param opcode the opcode of the instruction to be constructed.
147674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
148674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    protected AbstractInsnNode(final int opcode) {
149674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        this.opcode = opcode;
150674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        this.index = -1;
151674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
152674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
153674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
154674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Returns the opcode of this instruction.
155674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
156674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @return the opcode of this instruction.
157674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
158674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public int getOpcode() {
159674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        return opcode;
160674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
161674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
162674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
163674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Returns the type of this instruction.
164674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
165674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @return the type of this instruction, i.e. one the constants defined in
166674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *         this class.
167674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
168674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public abstract int getType();
169674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
170674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
171674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Returns the previous instruction in the list to which this instruction
172674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * belongs, if any.
173674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
174674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @return the previous instruction in the list to which this instruction
175674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *         belongs, if any. May be <tt>null</tt>.
176674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
177674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public AbstractInsnNode getPrevious() {
178674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        return prev;
179674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
180674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
181674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
182674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Returns the next instruction in the list to which this instruction
183674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * belongs, if any.
184674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
185674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @return the next instruction in the list to which this instruction
186674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *         belongs, if any. May be <tt>null</tt>.
187674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
188674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public AbstractInsnNode getNext() {
189674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        return next;
190674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
191674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
192674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
193674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Makes the given code visitor visit this instruction.
194674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
195674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param cv a code visitor.
196674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
197674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public abstract void accept(final MethodVisitor cv);
198674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
199674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
200674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Returns a copy of this instruction.
201674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
202674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param labels a map from LabelNodes to cloned LabelNodes.
203674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @return a copy of this instruction. The returned instruction does not
204674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *         belong to any {@link InsnList}.
205674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
206674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public abstract AbstractInsnNode clone(final Map labels);
207674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
208674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
209674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Returns the clone of the given label.
210674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
211674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param label a label.
212674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param map a map from LabelNodes to cloned LabelNodes.
213674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @return the clone of the given label.
214674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
215674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    static LabelNode clone(final LabelNode label, final Map map) {
216674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        return (LabelNode) map.get(label);
217674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
218674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
219674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
220674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Returns the clones of the given labels.
221674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
222674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param labels a list of labels.
223674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param map a map from LabelNodes to cloned LabelNodes.
224674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @return the clones of the given labels.
225674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
226674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    static LabelNode[] clone(final List labels, final Map map) {
227674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        LabelNode[] clones = new LabelNode[labels.size()];
228674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        for (int i = 0; i < clones.length; ++i) {
229674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            clones[i] = (LabelNode) map.get(labels.get(i));
230674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
231674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        return clones;
232674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
233674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen}
234