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; 31674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 32674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport java.lang.reflect.Constructor; 33674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport java.lang.reflect.Method; 34674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 35674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen/** 36674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * A Java type. This class can be used to make it easier to manipulate type and 37674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * method descriptors. 38674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 39674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @author Eric Bruneton 40674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @author Chris Nokleberg 41674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 42674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenpublic class Type { 43674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 44674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 45674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The sort of the <tt>void</tt> type. See {@link #getSort getSort}. 46674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 47674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static final int VOID = 0; 48674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 49674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 50674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The sort of the <tt>boolean</tt> type. See {@link #getSort getSort}. 51674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 52674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static final int BOOLEAN = 1; 53674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 54674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 55674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The sort of the <tt>char</tt> type. See {@link #getSort getSort}. 56674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 57674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static final int CHAR = 2; 58674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 59674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 60674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The sort of the <tt>byte</tt> type. See {@link #getSort getSort}. 61674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 62674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static final int BYTE = 3; 63674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 64674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 65674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The sort of the <tt>short</tt> type. See {@link #getSort getSort}. 66674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 67674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static final int SHORT = 4; 68674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 69674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 70674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The sort of the <tt>int</tt> type. See {@link #getSort getSort}. 71674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 72674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static final int INT = 5; 73674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 74674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 75674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The sort of the <tt>float</tt> type. See {@link #getSort getSort}. 76674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 77674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static final int FLOAT = 6; 78674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 79674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 80674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The sort of the <tt>long</tt> type. See {@link #getSort getSort}. 81674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 82674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static final int LONG = 7; 83674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 84674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 85674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The sort of the <tt>double</tt> type. See {@link #getSort getSort}. 86674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 87674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static final int DOUBLE = 8; 88674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 89674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 90674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The sort of array reference types. See {@link #getSort getSort}. 91674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 92674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static final int ARRAY = 9; 93674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 94674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 95674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The sort of object reference type. See {@link #getSort getSort}. 96674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 97674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static final int OBJECT = 10; 98674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 99674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 100674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The <tt>void</tt> type. 101674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 102674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static final Type VOID_TYPE = new Type(VOID); 103674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 104674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 105674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The <tt>boolean</tt> type. 106674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 107674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static final Type BOOLEAN_TYPE = new Type(BOOLEAN); 108674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 109674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 110674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The <tt>char</tt> type. 111674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 112674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static final Type CHAR_TYPE = new Type(CHAR); 113674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 114674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 115674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The <tt>byte</tt> type. 116674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 117674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static final Type BYTE_TYPE = new Type(BYTE); 118674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 119674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 120674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The <tt>short</tt> type. 121674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 122674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static final Type SHORT_TYPE = new Type(SHORT); 123674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 124674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 125674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The <tt>int</tt> type. 126674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 127674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static final Type INT_TYPE = new Type(INT); 128674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 129674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 130674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The <tt>float</tt> type. 131674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 132674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static final Type FLOAT_TYPE = new Type(FLOAT); 133674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 134674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 135674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The <tt>long</tt> type. 136674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 137674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static final Type LONG_TYPE = new Type(LONG); 138674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 139674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 140674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The <tt>double</tt> type. 141674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 142674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static final Type DOUBLE_TYPE = new Type(DOUBLE); 143674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 144674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // ------------------------------------------------------------------------ 145674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // Fields 146674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // ------------------------------------------------------------------------ 147674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 148674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 149674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The sort of this Java type. 150674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 151674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen private final int sort; 152674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 153674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 154674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * A buffer containing the internal name of this Java type. This field is 155674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * only used for reference types. 156674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 157674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen private final char[] buf; 158674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 159674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 160674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The offset of the internal name of this Java type in {@link #buf buf}. 161674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * This field is only used for reference types. 162674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 163674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen private final int off; 164674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 165674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 166674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * The length of the internal name of this Java type. This field is only 167674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * used for reference types. 168674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 169674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen private final int len; 170674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 171674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // ------------------------------------------------------------------------ 172674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // Constructors 173674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // ------------------------------------------------------------------------ 174674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 175674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 176674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Constructs a primitive type. 177674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 178674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param sort the sort of the primitive type to be constructed. 179674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 180674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen private Type(final int sort) { 181674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen this(sort, null, 0, 1); 182674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 183674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 184674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 185674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Constructs a reference type. 186674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 187674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param sort the sort of the reference type to be constructed. 188674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param buf a buffer containing the descriptor of the previous type. 189674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param off the offset of this descriptor in the previous buffer. 190674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param len the length of this descriptor. 191674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 192674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen private Type(final int sort, final char[] buf, final int off, final int len) 193674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen { 194674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen this.sort = sort; 195674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen this.buf = buf; 196674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen this.off = off; 197674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen this.len = len; 198674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 199674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 200674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 201674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Returns the Java type corresponding to the given type descriptor. 202674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 203674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param typeDescriptor a type descriptor. 204674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @return the Java type corresponding to the given type descriptor. 205674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 206674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static Type getType(final String typeDescriptor) { 207674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return getType(typeDescriptor.toCharArray(), 0); 208674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 209674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 210674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 211674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Returns the Java type corresponding to the given internal name. 212674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 213674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param internalName an internal name. 214674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @return the Java type corresponding to the given internal name. 215674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 216674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static Type getObjectType(final String internalName) { 217674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen char[] buf = internalName.toCharArray(); 218674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return new Type(buf[0] == '[' ? ARRAY : OBJECT, buf, 0, buf.length); 219674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 220674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 221674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 222674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Returns the Java type corresponding to the given class. 223674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 224674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param c a class. 225674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @return the Java type corresponding to the given class. 226674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 227674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static Type getType(final Class c) { 228674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (c.isPrimitive()) { 229674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (c == Integer.TYPE) { 230674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return INT_TYPE; 231674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } else if (c == Void.TYPE) { 232674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return VOID_TYPE; 233674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } else if (c == Boolean.TYPE) { 234674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BOOLEAN_TYPE; 235674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } else if (c == Byte.TYPE) { 236674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BYTE_TYPE; 237674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } else if (c == Character.TYPE) { 238674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return CHAR_TYPE; 239674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } else if (c == Short.TYPE) { 240674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return SHORT_TYPE; 241674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } else if (c == Double.TYPE) { 242674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return DOUBLE_TYPE; 243674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } else if (c == Float.TYPE) { 244674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return FLOAT_TYPE; 245674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } else /* if (c == Long.TYPE) */{ 246674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return LONG_TYPE; 247674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 248674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } else { 249674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return getType(getDescriptor(c)); 250674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 251674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 252674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 253674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 254674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Returns the Java types corresponding to the argument types of the given 255674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * method descriptor. 256674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 257674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param methodDescriptor a method descriptor. 258674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @return the Java types corresponding to the argument types of the given 259674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * method descriptor. 260674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 261674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static Type[] getArgumentTypes(final String methodDescriptor) { 262674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen char[] buf = methodDescriptor.toCharArray(); 263674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen int off = 1; 264674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen int size = 0; 265674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen while (true) { 266674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen char car = buf[off++]; 267674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (car == ')') { 268674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen break; 269674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } else if (car == 'L') { 270674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen while (buf[off++] != ';') { 271674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 272674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen ++size; 273674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } else if (car != '[') { 274674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen ++size; 275674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 276674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 277674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen Type[] args = new Type[size]; 278674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen off = 1; 279674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen size = 0; 280674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen while (buf[off] != ')') { 281674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen args[size] = getType(buf, off); 282674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen off += args[size].len + (args[size].sort == OBJECT ? 2 : 0); 283674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen size += 1; 284674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 285674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return args; 286674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 287674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 288674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 289674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Returns the Java types corresponding to the argument types of the given 290674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * method. 291674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 292674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param method a method. 293674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @return the Java types corresponding to the argument types of the given 294674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * method. 295674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 296674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static Type[] getArgumentTypes(final Method method) { 297674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen Class[] classes = method.getParameterTypes(); 298674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen Type[] types = new Type[classes.length]; 299674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen for (int i = classes.length - 1; i >= 0; --i) { 300674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen types[i] = getType(classes[i]); 301674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 302674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return types; 303674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 304674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 305674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 306674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Returns the Java type corresponding to the return type of the given 307674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * method descriptor. 308674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 309674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param methodDescriptor a method descriptor. 310674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @return the Java type corresponding to the return type of the given 311674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * method descriptor. 312674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 313674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static Type getReturnType(final String methodDescriptor) { 314674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen char[] buf = methodDescriptor.toCharArray(); 315674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return getType(buf, methodDescriptor.indexOf(')') + 1); 316674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 317674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 318674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 319674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Returns the Java type corresponding to the return type of the given 320674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * method. 321674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 322674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param method a method. 323674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @return the Java type corresponding to the return type of the given 324674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * method. 325674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 326674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static Type getReturnType(final Method method) { 327674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return getType(method.getReturnType()); 328674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 329674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 330674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 331674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Returns the Java type corresponding to the given type descriptor. 332674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 333674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param buf a buffer containing a type descriptor. 334674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param off the offset of this descriptor in the previous buffer. 335674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @return the Java type corresponding to the given type descriptor. 336674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 337674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen private static Type getType(final char[] buf, final int off) { 338674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen int len; 339674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen switch (buf[off]) { 340674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case 'V': 341674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return VOID_TYPE; 342674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case 'Z': 343674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BOOLEAN_TYPE; 344674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case 'C': 345674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return CHAR_TYPE; 346674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case 'B': 347674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BYTE_TYPE; 348674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case 'S': 349674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return SHORT_TYPE; 350674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case 'I': 351674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return INT_TYPE; 352674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case 'F': 353674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return FLOAT_TYPE; 354674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case 'J': 355674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return LONG_TYPE; 356674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case 'D': 357674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return DOUBLE_TYPE; 358674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case '[': 359674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen len = 1; 360674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen while (buf[off + len] == '[') { 361674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen ++len; 362674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 363674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (buf[off + len] == 'L') { 364674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen ++len; 365674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen while (buf[off + len] != ';') { 366674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen ++len; 367674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 368674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 369674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return new Type(ARRAY, buf, off, len + 1); 370674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // case 'L': 371674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen default: 372674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen len = 1; 373674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen while (buf[off + len] != ';') { 374674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen ++len; 375674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 376674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return new Type(OBJECT, buf, off + 1, len - 1); 377674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 378674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 379674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 380674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // ------------------------------------------------------------------------ 381674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // Accessors 382674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // ------------------------------------------------------------------------ 383674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 384674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 385674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Returns the sort of this Java type. 386674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 387674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @return {@link #VOID VOID}, {@link #BOOLEAN BOOLEAN}, 388674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * {@link #CHAR CHAR}, {@link #BYTE BYTE}, {@link #SHORT SHORT}, 389674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * {@link #INT INT}, {@link #FLOAT FLOAT}, {@link #LONG LONG}, 390674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * {@link #DOUBLE DOUBLE}, {@link #ARRAY ARRAY} or 391674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * {@link #OBJECT OBJECT}. 392674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 393674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public int getSort() { 394674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return sort; 395674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 396674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 397674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 398674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Returns the number of dimensions of this array type. This method should 399674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * only be used for an array type. 400674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 401674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @return the number of dimensions of this array type. 402674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 403674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public int getDimensions() { 404674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen int i = 1; 405674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen while (buf[off + i] == '[') { 406674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen ++i; 407674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 408674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return i; 409674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 410674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 411674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 412674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Returns the type of the elements of this array type. This method should 413674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * only be used for an array type. 414674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 415674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @return Returns the type of the elements of this array type. 416674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 417674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public Type getElementType() { 418674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return getType(buf, off + getDimensions()); 419674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 420674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 421674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 422674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Returns the name of the class corresponding to this type. 423674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 424674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @return the fully qualified name of the class corresponding to this type. 425674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 426674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public String getClassName() { 427674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen switch (sort) { 428674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case VOID: 429674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return "void"; 430674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case BOOLEAN: 431674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return "boolean"; 432674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case CHAR: 433674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return "char"; 434674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case BYTE: 435674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return "byte"; 436674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case SHORT: 437674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return "short"; 438674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case INT: 439674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return "int"; 440674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case FLOAT: 441674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return "float"; 442674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case LONG: 443674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return "long"; 444674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case DOUBLE: 445674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return "double"; 446674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case ARRAY: 447674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen StringBuffer b = new StringBuffer(getElementType().getClassName()); 448674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen for (int i = getDimensions(); i > 0; --i) { 449674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen b.append("[]"); 450674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 451674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return b.toString(); 452674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // case OBJECT: 453674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen default: 454674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return new String(buf, off, len).replace('/', '.'); 455674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 456674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 457674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 458674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 459674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Returns the internal name of the class corresponding to this object or 460674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * array type. The internal name of a class is its fully qualified name (as 461674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * returned by Class.getName(), where '.' are replaced by '/'. This method 462674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * should only be used for an object or array type. 463674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 464674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @return the internal name of the class corresponding to this object type. 465674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 466674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public String getInternalName() { 467674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return new String(buf, off, len); 468674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 469674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 470674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // ------------------------------------------------------------------------ 471674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // Conversion to type descriptors 472674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // ------------------------------------------------------------------------ 473674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 474674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 475674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Returns the descriptor corresponding to this Java type. 476674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 477674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @return the descriptor corresponding to this Java type. 478674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 479674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public String getDescriptor() { 480674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen StringBuffer buf = new StringBuffer(); 481674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen getDescriptor(buf); 482674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return buf.toString(); 483674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 484674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 485674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 486674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Returns the descriptor corresponding to the given argument and return 487674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * types. 488674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 489674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param returnType the return type of the method. 490674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param argumentTypes the argument types of the method. 491674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @return the descriptor corresponding to the given argument and return 492674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * types. 493674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 494674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static String getMethodDescriptor( 495674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final Type returnType, 496674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final Type[] argumentTypes) 497674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen { 498674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen StringBuffer buf = new StringBuffer(); 499674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen buf.append('('); 500674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen for (int i = 0; i < argumentTypes.length; ++i) { 501674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen argumentTypes[i].getDescriptor(buf); 502674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 503674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen buf.append(')'); 504674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen returnType.getDescriptor(buf); 505674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return buf.toString(); 506674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 507674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 508674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 509674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Appends the descriptor corresponding to this Java type to the given 510674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * string buffer. 511674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 512674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param buf the string buffer to which the descriptor must be appended. 513674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 514674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen private void getDescriptor(final StringBuffer buf) { 515674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen switch (sort) { 516674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case VOID: 517674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen buf.append('V'); 518674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return; 519674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case BOOLEAN: 520674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen buf.append('Z'); 521674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return; 522674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case CHAR: 523674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen buf.append('C'); 524674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return; 525674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case BYTE: 526674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen buf.append('B'); 527674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return; 528674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case SHORT: 529674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen buf.append('S'); 530674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return; 531674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case INT: 532674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen buf.append('I'); 533674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return; 534674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case FLOAT: 535674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen buf.append('F'); 536674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return; 537674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case LONG: 538674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen buf.append('J'); 539674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return; 540674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case DOUBLE: 541674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen buf.append('D'); 542674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return; 543674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case ARRAY: 544674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen buf.append(this.buf, off, len); 545674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return; 546674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // case OBJECT: 547674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen default: 548674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen buf.append('L'); 549674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen buf.append(this.buf, off, len); 550674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen buf.append(';'); 551674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 552674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 553674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 554674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // ------------------------------------------------------------------------ 555674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // Direct conversion from classes to type descriptors, 556674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // without intermediate Type objects 557674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // ------------------------------------------------------------------------ 558674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 559674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 560674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Returns the internal name of the given class. The internal name of a 561674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * class is its fully qualified name, as returned by Class.getName(), where 562674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * '.' are replaced by '/'. 563674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 564674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param c an object or array class. 565674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @return the internal name of the given class. 566674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 567674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static String getInternalName(final Class c) { 568674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return c.getName().replace('.', '/'); 569674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 570674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 571674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 572674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Returns the descriptor corresponding to the given Java type. 573674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 574674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param c an object class, a primitive class or an array class. 575674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @return the descriptor corresponding to the given class. 576674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 577674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static String getDescriptor(final Class c) { 578674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen StringBuffer buf = new StringBuffer(); 579674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen getDescriptor(buf, c); 580674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return buf.toString(); 581674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 582674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 583674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 584674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Returns the descriptor corresponding to the given constructor. 585674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 586674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param c a {@link Constructor Constructor} object. 587674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @return the descriptor of the given constructor. 588674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 589674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static String getConstructorDescriptor(final Constructor c) { 590674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen Class[] parameters = c.getParameterTypes(); 591674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen StringBuffer buf = new StringBuffer(); 592674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen buf.append('('); 593674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen for (int i = 0; i < parameters.length; ++i) { 594674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen getDescriptor(buf, parameters[i]); 595674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 596674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return buf.append(")V").toString(); 597674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 598674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 599674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 600674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Returns the descriptor corresponding to the given method. 601674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 602674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param m a {@link Method Method} object. 603674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @return the descriptor of the given method. 604674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 605674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public static String getMethodDescriptor(final Method m) { 606674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen Class[] parameters = m.getParameterTypes(); 607674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen StringBuffer buf = new StringBuffer(); 608674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen buf.append('('); 609674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen for (int i = 0; i < parameters.length; ++i) { 610674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen getDescriptor(buf, parameters[i]); 611674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 612674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen buf.append(')'); 613674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen getDescriptor(buf, m.getReturnType()); 614674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return buf.toString(); 615674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 616674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 617674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 618674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Appends the descriptor of the given class to the given string buffer. 619674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 620674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param buf the string buffer to which the descriptor must be appended. 621674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param c the class whose descriptor must be computed. 622674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 623674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen private static void getDescriptor(final StringBuffer buf, final Class c) { 624674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen Class d = c; 625674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen while (true) { 626674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (d.isPrimitive()) { 627674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen char car; 628674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (d == Integer.TYPE) { 629674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen car = 'I'; 630674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } else if (d == Void.TYPE) { 631674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen car = 'V'; 632674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } else if (d == Boolean.TYPE) { 633674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen car = 'Z'; 634674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } else if (d == Byte.TYPE) { 635674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen car = 'B'; 636674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } else if (d == Character.TYPE) { 637674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen car = 'C'; 638674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } else if (d == Short.TYPE) { 639674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen car = 'S'; 640674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } else if (d == Double.TYPE) { 641674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen car = 'D'; 642674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } else if (d == Float.TYPE) { 643674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen car = 'F'; 644674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } else /* if (d == Long.TYPE) */{ 645674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen car = 'J'; 646674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 647674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen buf.append(car); 648674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return; 649674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } else if (d.isArray()) { 650674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen buf.append('['); 651674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen d = d.getComponentType(); 652674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } else { 653674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen buf.append('L'); 654674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen String name = d.getName(); 655674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen int len = name.length(); 656674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen for (int i = 0; i < len; ++i) { 657674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen char car = name.charAt(i); 658674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen buf.append(car == '.' ? '/' : car); 659674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 660674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen buf.append(';'); 661674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return; 662674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 663674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 664674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 665674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 666674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // ------------------------------------------------------------------------ 667674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // Corresponding size and opcodes 668674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // ------------------------------------------------------------------------ 669674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 670674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 671674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Returns the size of values of this type. 672674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 673674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @return the size of values of this type, i.e., 2 for <tt>long</tt> and 674674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * <tt>double</tt>, and 1 otherwise. 675674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 676674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public int getSize() { 677674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return sort == LONG || sort == DOUBLE ? 2 : 1; 678674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 679674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 680674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 681674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Returns a JVM instruction opcode adapted to this Java type. 682674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 683674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param opcode a JVM instruction opcode. This opcode must be one of ILOAD, 684674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * ISTORE, IALOAD, IASTORE, IADD, ISUB, IMUL, IDIV, IREM, INEG, ISHL, 685674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * ISHR, IUSHR, IAND, IOR, IXOR and IRETURN. 686674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @return an opcode that is similar to the given opcode, but adapted to 687674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * this Java type. For example, if this type is <tt>float</tt> and 688674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * <tt>opcode</tt> is IRETURN, this method returns FRETURN. 689674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 690674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public int getOpcode(final int opcode) { 691674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (opcode == Opcodes.IALOAD || opcode == Opcodes.IASTORE) { 692674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen switch (sort) { 693674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case BOOLEAN: 694674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case BYTE: 695674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return opcode + 5; 696674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case CHAR: 697674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return opcode + 6; 698674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case SHORT: 699674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return opcode + 7; 700674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case INT: 701674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return opcode; 702674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case FLOAT: 703674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return opcode + 2; 704674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case LONG: 705674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return opcode + 1; 706674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case DOUBLE: 707674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return opcode + 3; 708674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // case ARRAY: 709674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // case OBJECT: 710674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen default: 711674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return opcode + 4; 712674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 713674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } else { 714674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen switch (sort) { 715674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case VOID: 716674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return opcode + 5; 717674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case BOOLEAN: 718674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case CHAR: 719674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case BYTE: 720674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case SHORT: 721674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case INT: 722674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return opcode; 723674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case FLOAT: 724674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return opcode + 2; 725674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case LONG: 726674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return opcode + 1; 727674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case DOUBLE: 728674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return opcode + 3; 729674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // case ARRAY: 730674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // case OBJECT: 731674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen default: 732674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return opcode + 4; 733674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 734674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 735674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 736674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 737674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // ------------------------------------------------------------------------ 738674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // Equals, hashCode and toString 739674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen // ------------------------------------------------------------------------ 740674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 741674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 742674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Tests if the given object is equal to this type. 743674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 744674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @param o the object to be compared to this type. 745674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @return <tt>true</tt> if the given object is equal to this type. 746674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 747674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public boolean equals(final Object o) { 748674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (this == o) { 749674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return true; 750674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 751674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (!(o instanceof Type)) { 752674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return false; 753674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 754674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen Type t = (Type) o; 755674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (sort != t.sort) { 756674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return false; 757674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 758674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (sort == OBJECT || sort == ARRAY) { 759674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (len != t.len) { 760674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return false; 761674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 762674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen for (int i = off, j = t.off, end = i + len; i < end; i++, j++) { 763674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (buf[i] != t.buf[j]) { 764674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return false; 765674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 766674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 767674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 768674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return true; 769674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 770674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 771674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 772674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Returns a hash code value for this type. 773674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 774674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @return a hash code value for this type. 775674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 776674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public int hashCode() { 777674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen int hc = 13 * sort; 778674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (sort == OBJECT || sort == ARRAY) { 779674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen for (int i = off, end = i + len; i < end; i++) { 780674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen hc = 17 * (hc + buf[i]); 781674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 782674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 783674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return hc; 784674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 785674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 786674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen /** 787674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Returns a string representation of this type. 788674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 789674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @return the descriptor of this type. 790674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 791674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public String toString() { 792674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return getDescriptor(); 793674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 794674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen} 795