Home | History | Annotate | Download | only in tree
      1 /***
      2  * ASM: a very small and fast Java bytecode manipulation framework
      3  * Copyright (c) 2000-2007 INRIA, France Telecom
      4  * All rights reserved.
      5  *
      6  * Redistribution and use in source and binary forms, with or without
      7  * modification, are permitted provided that the following conditions
      8  * are met:
      9  * 1. Redistributions of source code must retain the above copyright
     10  *    notice, this list of conditions and the following disclaimer.
     11  * 2. Redistributions in binary form must reproduce the above copyright
     12  *    notice, this list of conditions and the following disclaimer in the
     13  *    documentation and/or other materials provided with the distribution.
     14  * 3. Neither the name of the copyright holders nor the names of its
     15  *    contributors may be used to endorse or promote products derived from
     16  *    this software without specific prior written permission.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     19  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     21  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
     22  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
     28  * THE POSSIBILITY OF SUCH DAMAGE.
     29  */
     30 package org.mockito.asm.tree;
     31 
     32 import org.mockito.asm.Label;
     33 import org.mockito.asm.MethodVisitor;
     34 import org.mockito.asm.Opcodes;
     35 
     36 import java.util.List;
     37 import java.util.ArrayList;
     38 import java.util.Arrays;
     39 import java.util.Map;
     40 
     41 /**
     42  * A node that represents a LOOKUPSWITCH instruction.
     43  *
     44  * @author Eric Bruneton
     45  */
     46 public class LookupSwitchInsnNode extends AbstractInsnNode {
     47 
     48     /**
     49      * Beginning of the default handler block.
     50      */
     51     public LabelNode dflt;
     52 
     53     /**
     54      * The values of the keys. This list is a list of {@link Integer} objects.
     55      */
     56     public List keys;
     57 
     58     /**
     59      * Beginnings of the handler blocks. This list is a list of
     60      * {@link LabelNode} objects.
     61      */
     62     public List labels;
     63 
     64     /**
     65      * Constructs a new {@link LookupSwitchInsnNode}.
     66      *
     67      * @param dflt beginning of the default handler block.
     68      * @param keys the values of the keys.
     69      * @param labels beginnings of the handler blocks. <tt>labels[i]</tt> is
     70      *        the beginning of the handler block for the <tt>keys[i]</tt> key.
     71      */
     72     public LookupSwitchInsnNode(
     73         final LabelNode dflt,
     74         final int[] keys,
     75         final LabelNode[] labels)
     76     {
     77         super(Opcodes.LOOKUPSWITCH);
     78         this.dflt = dflt;
     79         this.keys = new ArrayList(keys == null ? 0 : keys.length);
     80         this.labels = new ArrayList(labels == null ? 0 : labels.length);
     81         if (keys != null) {
     82             for (int i = 0; i < keys.length; ++i) {
     83                 this.keys.add(new Integer(keys[i]));
     84             }
     85         }
     86         if (labels != null) {
     87             this.labels.addAll(Arrays.asList(labels));
     88         }
     89     }
     90 
     91     public int getType() {
     92         return LOOKUPSWITCH_INSN;
     93     }
     94 
     95     public void accept(final MethodVisitor mv) {
     96         int[] keys = new int[this.keys.size()];
     97         for (int i = 0; i < keys.length; ++i) {
     98             keys[i] = ((Integer) this.keys.get(i)).intValue();
     99         }
    100         Label[] labels = new Label[this.labels.size()];
    101         for (int i = 0; i < labels.length; ++i) {
    102             labels[i] = ((LabelNode) this.labels.get(i)).getLabel();
    103         }
    104         mv.visitLookupSwitchInsn(dflt.getLabel(), keys, labels);
    105     }
    106 
    107     public AbstractInsnNode clone(final Map labels) {
    108         LookupSwitchInsnNode clone = new LookupSwitchInsnNode(clone(dflt,
    109                 labels), null, clone(this.labels, labels));
    110         clone.keys.addAll(keys);
    111         return clone;
    112     }
    113 }
    114