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 org.mockito.asm.Label;
33674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.MethodVisitor;
34674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.Opcodes;
35674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
36674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport java.util.ArrayList;
37674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport java.util.Arrays;
38674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport java.util.List;
39674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport java.util.Map;
40674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
41674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen/**
42674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * A node that represents a TABLESWITCH instruction.
43674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *
44674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @author Eric Bruneton
45674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */
46674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenpublic class TableSwitchInsnNode extends AbstractInsnNode {
47674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
48674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
49674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The minimum key value.
50674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
51674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public int min;
52674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
53674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
54674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The maximum key value.
55674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
56674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public int max;
57674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
58674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
59674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Beginning of the default handler block.
60674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
61674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public LabelNode dflt;
62674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
63674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
64674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Beginnings of the handler blocks. This list is a list of
65674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * {@link LabelNode} objects.
66674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
67674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public List labels;
68674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
69674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
70674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Constructs a new {@link TableSwitchInsnNode}.
71674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
72674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param min the minimum key value.
73674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param max the maximum key value.
74674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param dflt beginning of the default handler block.
75674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param labels beginnings of the handler blocks. <tt>labels[i]</tt> is
76674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *        the beginning of the handler block for the <tt>min + i</tt> key.
77674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
78674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public TableSwitchInsnNode(
79674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final int min,
80674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final int max,
81674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final LabelNode dflt,
82674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final LabelNode[] labels)
83674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    {
84674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        super(Opcodes.TABLESWITCH);
85674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        this.min = min;
86674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        this.max = max;
87674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        this.dflt = dflt;
88674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        this.labels = new ArrayList();
89674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (labels != null) {
90674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            this.labels.addAll(Arrays.asList(labels));
91674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
92674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
93674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
94674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public int getType() {
95674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        return TABLESWITCH_INSN;
96674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
97674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
98674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void accept(final MethodVisitor mv) {
99674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        Label[] labels = new Label[this.labels.size()];
100674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        for (int i = 0; i < labels.length; ++i) {
101674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            labels[i] = ((LabelNode) this.labels.get(i)).getLabel();
102674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
103674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        mv.visitTableSwitchInsn(min, max, dflt.getLabel(), labels);
104674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
105674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
106674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public AbstractInsnNode clone(final Map labels) {
107674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        return new TableSwitchInsnNode(min,
108674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                max,
109674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                clone(dflt, labels),
110674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                clone(this.labels, labels));
111674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
112674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen}