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