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.Label; 033import io.ebean.enhance.asm.MethodVisitor; 034import io.ebean.enhance.asm.Opcodes; 035 036import java.util.ArrayList; 037import java.util.Arrays; 038import java.util.List; 039import java.util.Map; 040 041/** 042 * A node that represents a TABLESWITCH instruction. 043 * 044 * @author Eric Bruneton 045 */ 046public class TableSwitchInsnNode extends AbstractInsnNode { 047 048 /** 049 * The minimum key value. 050 */ 051 public int min; 052 053 /** 054 * The maximum key value. 055 */ 056 public int max; 057 058 /** 059 * Beginning of the default handler block. 060 */ 061 public LabelNode dflt; 062 063 /** 064 * Beginnings of the handler blocks. This list is a list of 065 * {@link LabelNode} objects. 066 */ 067 public List<LabelNode> labels; 068 069 /** 070 * Constructs a new {@link TableSwitchInsnNode}. 071 * 072 * @param min 073 * the minimum key value. 074 * @param max 075 * the maximum key value. 076 * @param dflt 077 * beginning of the default handler block. 078 * @param labels 079 * beginnings of the handler blocks. <tt>labels[i]</tt> is the 080 * beginning of the handler block for the <tt>min + i</tt> key. 081 */ 082 public TableSwitchInsnNode(final int min, final int max, 083 final LabelNode dflt, final LabelNode... labels) { 084 super(Opcodes.TABLESWITCH); 085 this.min = min; 086 this.max = max; 087 this.dflt = dflt; 088 this.labels = new ArrayList<LabelNode>(); 089 if (labels != null) { 090 this.labels.addAll(Arrays.asList(labels)); 091 } 092 } 093 094 @Override 095 public int getType() { 096 return TABLESWITCH_INSN; 097 } 098 099 @Override 100 public void accept(final MethodVisitor mv) { 101 Label[] labels = new Label[this.labels.size()]; 102 for (int i = 0; i < labels.length; ++i) { 103 labels[i] = this.labels.get(i).getLabel(); 104 } 105 mv.visitTableSwitchInsn(min, max, dflt.getLabel(), labels); 106 acceptAnnotations(mv); 107 } 108 109 @Override 110 public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) { 111 return new TableSwitchInsnNode(min, max, clone(dflt, labels), clone( 112 this.labels, labels)).cloneAnnotations(this); 113 } 114}