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 LOOKUPSWITCH instruction. 043 * 044 * @author Eric Bruneton 045 */ 046public class LookupSwitchInsnNode extends AbstractInsnNode { 047 048 /** 049 * Beginning of the default handler block. 050 */ 051 public LabelNode dflt; 052 053 /** 054 * The values of the keys. This list is a list of {@link Integer} objects. 055 */ 056 public List<Integer> keys; 057 058 /** 059 * Beginnings of the handler blocks. This list is a list of 060 * {@link LabelNode} objects. 061 */ 062 public List<LabelNode> labels; 063 064 /** 065 * Constructs a new {@link LookupSwitchInsnNode}. 066 * 067 * @param dflt 068 * beginning of the default handler block. 069 * @param keys 070 * the values of the keys. 071 * @param labels 072 * beginnings of the handler blocks. <tt>labels[i]</tt> is the 073 * beginning of the handler block for the <tt>keys[i]</tt> key. 074 */ 075 public LookupSwitchInsnNode(final LabelNode dflt, final int[] keys, 076 final LabelNode[] labels) { 077 super(Opcodes.LOOKUPSWITCH); 078 this.dflt = dflt; 079 this.keys = new ArrayList<Integer>(keys == null ? 0 : keys.length); 080 this.labels = new ArrayList<LabelNode>(labels == null ? 0 081 : labels.length); 082 if (keys != null) { 083 for (int i = 0; i < keys.length; ++i) { 084 this.keys.add(keys[i]); 085 } 086 } 087 if (labels != null) { 088 this.labels.addAll(Arrays.asList(labels)); 089 } 090 } 091 092 @Override 093 public int getType() { 094 return LOOKUPSWITCH_INSN; 095 } 096 097 @Override 098 public void accept(final MethodVisitor mv) { 099 int[] keys = new int[this.keys.size()]; 100 for (int i = 0; i < keys.length; ++i) { 101 keys[i] = this.keys.get(i).intValue(); 102 } 103 Label[] labels = new Label[this.labels.size()]; 104 for (int i = 0; i < labels.length; ++i) { 105 labels[i] = this.labels.get(i).getLabel(); 106 } 107 mv.visitLookupSwitchInsn(dflt.getLabel(), keys, labels); 108 acceptAnnotations(mv); 109 } 110 111 @Override 112 public AbstractInsnNode clone(final Map<LabelNode, LabelNode> labels) { 113 LookupSwitchInsnNode clone = new LookupSwitchInsnNode(clone(dflt, 114 labels), null, clone(this.labels, labels)); 115 clone.keys.addAll(keys); 116 return clone.cloneAnnotations(this); 117 } 118}