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 Boekenoogen/**
33674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Information about the input and output stack map frames of a basic block.
34674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *
35674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @author Eric Bruneton
36674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */
37674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenfinal class Frame {
38674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
39674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /*
40674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Frames are computed in a two steps process: during the visit of each
41674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * instruction, the state of the frame at the end of current basic block is
42674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * updated by simulating the action of the instruction on the previous state
43674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * of this so called "output frame". In visitMaxs, a fix point algorithm is
44674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * used to compute the "input frame" of each basic block, i.e. the stack map
45674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * frame at the begining of the basic block, starting from the input frame
46674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * of the first basic block (which is computed from the method descriptor),
47674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * and by using the previously computed output frames to compute the input
48674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * state of the other blocks.
49674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
50674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * All output and input frames are stored as arrays of integers. Reference
51674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * and array types are represented by an index into a type table (which is
52674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * not the same as the constant pool of the class, in order to avoid adding
53674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * unnecessary constants in the pool - not all computed frames will end up
54674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * being stored in the stack map table). This allows very fast type
55674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * comparisons.
56674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
57674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Output stack map frames are computed relatively to the input frame of the
58674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * basic block, which is not yet known when output frames are computed. It
59674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * is therefore necessary to be able to represent abstract types such as
60674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * "the type at position x in the input frame locals" or "the type at
61674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * position x from the top of the input frame stack" or even "the type at
62674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * position x in the input frame, with y more (or less) array dimensions".
63674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * This explains the rather complicated type format used in output frames.
64674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
65674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * This format is the following: DIM KIND VALUE (4, 4 and 24 bits). DIM is a
66674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * signed number of array dimensions (from -8 to 7). KIND is either BASE,
67674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * LOCAL or STACK. BASE is used for types that are not relative to the input
68674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * frame. LOCAL is used for types that are relative to the input local
69674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * variable types. STACK is used for types that are relative to the input
70674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * stack types. VALUE depends on KIND. For LOCAL types, it is an index in
71674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * the input local variable types. For STACK types, it is a position
72674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * relatively to the top of input frame stack. For BASE types, it is either
73674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * one of the constants defined in FrameVisitor, or for OBJECT and
74674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * UNINITIALIZED types, a tag and an index in the type table.
75674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
76674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Output frames can contain types of any kind and with a positive or
77674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * negative dimension (and even unassigned types, represented by 0 - which
78674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * does not correspond to any valid type value). Input frames can only
79674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * contain BASE types of positive or null dimension. In all cases the type
80674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * table contains only internal type names (array type descriptors are
81674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * forbidden - dimensions must be represented through the DIM field).
82674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
83674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The LONG and DOUBLE types are always represented by using two slots (LONG +
84674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * TOP or DOUBLE + TOP), for local variable types as well as in the operand
85674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * stack. This is necessary to be able to simulate DUPx_y instructions,
86674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * whose effect would be dependent on the actual type values if types were
87674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * always represented by a single slot in the stack (and this is not
88674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * possible, since actual type values are not always known - cf LOCAL and
89674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * STACK type kinds).
90674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
91674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
92674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
93674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Mask to get the dimension of a frame type. This dimension is a signed
94674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * integer between -8 and 7.
95674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
96674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    static final int DIM = 0xF0000000;
97674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
98674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
99674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Constant to be added to a type to get a type with one more dimension.
100674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
101674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    static final int ARRAY_OF = 0x10000000;
102674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
103674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
104674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Constant to be added to a type to get a type with one less dimension.
105674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
106674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    static final int ELEMENT_OF = 0xF0000000;
107674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
108674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
109674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Mask to get the kind of a frame type.
110674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
111674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @see #BASE
112674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @see #LOCAL
113674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @see #STACK
114674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
115674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    static final int KIND = 0xF000000;
116674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
117674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
118674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Mask to get the value of a frame type.
119674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
120674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    static final int VALUE = 0xFFFFFF;
121674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
122674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
123674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Mask to get the kind of base types.
124674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
125674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    static final int BASE_KIND = 0xFF00000;
126674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
127674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
128674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Mask to get the value of base types.
129674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
130674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    static final int BASE_VALUE = 0xFFFFF;
131674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
132674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
133674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Kind of the types that are not relative to an input stack map frame.
134674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
135674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    static final int BASE = 0x1000000;
136674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
137674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
138674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Base kind of the base reference types. The BASE_VALUE of such types is an
139674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * index into the type table.
140674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
141674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    static final int OBJECT = BASE | 0x700000;
142674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
143674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
144674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Base kind of the uninitialized base types. The BASE_VALUE of such types
145674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * in an index into the type table (the Item at that index contains both an
146674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * instruction offset and an internal class name).
147674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
148674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    static final int UNINITIALIZED = BASE | 0x800000;
149674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
150674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
151674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Kind of the types that are relative to the local variable types of an
152674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * input stack map frame. The value of such types is a local variable index.
153674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
154674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private static final int LOCAL = 0x2000000;
155674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
156674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
157674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Kind of the the types that are relative to the stack of an input stack
158674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * map frame. The value of such types is a position relatively to the top of
159674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * this stack.
160674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
161674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private static final int STACK = 0x3000000;
162674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
163674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
164674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The TOP type. This is a BASE type.
165674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
166674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    static final int TOP = BASE | 0;
167674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
168674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
169674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The BOOLEAN type. This is a BASE type mainly used for array types.
170674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
171674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    static final int BOOLEAN = BASE | 9;
172674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
173674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
174674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The BYTE type. This is a BASE type mainly used for array types.
175674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
176674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    static final int BYTE = BASE | 10;
177674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
178674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
179674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The CHAR type. This is a BASE type mainly used for array types.
180674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
181674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    static final int CHAR = BASE | 11;
182674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
183674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
184674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The SHORT type. This is a BASE type mainly used for array types.
185674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
186674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    static final int SHORT = BASE | 12;
187674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
188674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
189674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The INTEGER type. This is a BASE type.
190674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
191674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    static final int INTEGER = BASE | 1;
192674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
193674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
194674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The FLOAT type. This is a BASE type.
195674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
196674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    static final int FLOAT = BASE | 2;
197674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
198674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
199674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The DOUBLE type. This is a BASE type.
200674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
201674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    static final int DOUBLE = BASE | 3;
202674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
203674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
204674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The LONG type. This is a BASE type.
205674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
206674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    static final int LONG = BASE | 4;
207674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
208674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
209674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The NULL type. This is a BASE type.
210674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
211674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    static final int NULL = BASE | 5;
212674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
213674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
214674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The UNINITIALIZED_THIS type. This is a BASE type.
215674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
216674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    static final int UNINITIALIZED_THIS = BASE | 6;
217674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
218674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
219674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The stack size variation corresponding to each JVM instruction. This
220674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * stack variation is equal to the size of the values produced by an
221674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * instruction, minus the size of the values consumed by this instruction.
222674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
223674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    static final int[] SIZE;
224674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
225674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
226674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Computes the stack size variation corresponding to each JVM instruction.
227674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
228674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    static {
229674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        int i;
230674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        int[] b = new int[202];
231674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        String s = "EFFFFFFFFGGFFFGGFFFEEFGFGFEEEEEEEEEEEEEEEEEEEEDEDEDDDDD"
232674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                + "CDCDEEEEEEEEEEEEEEEEEEEEBABABBBBDCFFFGGGEDCDCDCDCDCDCDCDCD"
233674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                + "CDCEEEEDDDDDDDCDCDCEFEFDDEEFFDEDEEEBDDBBDDDDDDCCCCCCCCEFED"
234674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                + "DDCDCDEEEEEEEEEEFEEEEEEDDEEDDEE";
235674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        for (i = 0; i < b.length; ++i) {
236674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            b[i] = s.charAt(i) - 'E';
237674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
238674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        SIZE = b;
239674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
240674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // code to generate the above string
241674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        //
242674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // int NA = 0; // not applicable (unused opcode or variable size opcode)
243674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        //
244674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // b = new int[] {
245674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 0, //NOP, // visitInsn
246674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 1, //ACONST_NULL, // -
247674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 1, //ICONST_M1, // -
248674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 1, //ICONST_0, // -
249674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 1, //ICONST_1, // -
250674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 1, //ICONST_2, // -
251674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 1, //ICONST_3, // -
252674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 1, //ICONST_4, // -
253674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 1, //ICONST_5, // -
254674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 2, //LCONST_0, // -
255674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 2, //LCONST_1, // -
256674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 1, //FCONST_0, // -
257674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 1, //FCONST_1, // -
258674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 1, //FCONST_2, // -
259674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 2, //DCONST_0, // -
260674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 2, //DCONST_1, // -
261674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 1, //BIPUSH, // visitIntInsn
262674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 1, //SIPUSH, // -
263674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 1, //LDC, // visitLdcInsn
264674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //LDC_W, // -
265674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //LDC2_W, // -
266674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 1, //ILOAD, // visitVarInsn
267674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 2, //LLOAD, // -
268674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 1, //FLOAD, // -
269674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 2, //DLOAD, // -
270674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 1, //ALOAD, // -
271674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //ILOAD_0, // -
272674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //ILOAD_1, // -
273674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //ILOAD_2, // -
274674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //ILOAD_3, // -
275674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //LLOAD_0, // -
276674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //LLOAD_1, // -
277674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //LLOAD_2, // -
278674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //LLOAD_3, // -
279674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //FLOAD_0, // -
280674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //FLOAD_1, // -
281674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //FLOAD_2, // -
282674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //FLOAD_3, // -
283674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //DLOAD_0, // -
284674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //DLOAD_1, // -
285674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //DLOAD_2, // -
286674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //DLOAD_3, // -
287674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //ALOAD_0, // -
288674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //ALOAD_1, // -
289674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //ALOAD_2, // -
290674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //ALOAD_3, // -
291674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //IALOAD, // visitInsn
292674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 0, //LALOAD, // -
293674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //FALOAD, // -
294674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 0, //DALOAD, // -
295674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //AALOAD, // -
296674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //BALOAD, // -
297674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //CALOAD, // -
298674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //SALOAD, // -
299674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //ISTORE, // visitVarInsn
300674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -2, //LSTORE, // -
301674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //FSTORE, // -
302674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -2, //DSTORE, // -
303674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //ASTORE, // -
304674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //ISTORE_0, // -
305674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //ISTORE_1, // -
306674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //ISTORE_2, // -
307674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //ISTORE_3, // -
308674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //LSTORE_0, // -
309674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //LSTORE_1, // -
310674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //LSTORE_2, // -
311674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //LSTORE_3, // -
312674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //FSTORE_0, // -
313674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //FSTORE_1, // -
314674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //FSTORE_2, // -
315674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //FSTORE_3, // -
316674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //DSTORE_0, // -
317674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //DSTORE_1, // -
318674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //DSTORE_2, // -
319674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //DSTORE_3, // -
320674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //ASTORE_0, // -
321674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //ASTORE_1, // -
322674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //ASTORE_2, // -
323674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //ASTORE_3, // -
324674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -3, //IASTORE, // visitInsn
325674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -4, //LASTORE, // -
326674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -3, //FASTORE, // -
327674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -4, //DASTORE, // -
328674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -3, //AASTORE, // -
329674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -3, //BASTORE, // -
330674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -3, //CASTORE, // -
331674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -3, //SASTORE, // -
332674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //POP, // -
333674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -2, //POP2, // -
334674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 1, //DUP, // -
335674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 1, //DUP_X1, // -
336674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 1, //DUP_X2, // -
337674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 2, //DUP2, // -
338674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 2, //DUP2_X1, // -
339674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 2, //DUP2_X2, // -
340674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 0, //SWAP, // -
341674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //IADD, // -
342674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -2, //LADD, // -
343674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //FADD, // -
344674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -2, //DADD, // -
345674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //ISUB, // -
346674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -2, //LSUB, // -
347674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //FSUB, // -
348674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -2, //DSUB, // -
349674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //IMUL, // -
350674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -2, //LMUL, // -
351674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //FMUL, // -
352674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -2, //DMUL, // -
353674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //IDIV, // -
354674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -2, //LDIV, // -
355674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //FDIV, // -
356674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -2, //DDIV, // -
357674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //IREM, // -
358674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -2, //LREM, // -
359674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //FREM, // -
360674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -2, //DREM, // -
361674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 0, //INEG, // -
362674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 0, //LNEG, // -
363674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 0, //FNEG, // -
364674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 0, //DNEG, // -
365674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //ISHL, // -
366674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //LSHL, // -
367674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //ISHR, // -
368674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //LSHR, // -
369674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //IUSHR, // -
370674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //LUSHR, // -
371674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //IAND, // -
372674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -2, //LAND, // -
373674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //IOR, // -
374674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -2, //LOR, // -
375674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //IXOR, // -
376674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -2, //LXOR, // -
377674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 0, //IINC, // visitIincInsn
378674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 1, //I2L, // visitInsn
379674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 0, //I2F, // -
380674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 1, //I2D, // -
381674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //L2I, // -
382674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //L2F, // -
383674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 0, //L2D, // -
384674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 0, //F2I, // -
385674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 1, //F2L, // -
386674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 1, //F2D, // -
387674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //D2I, // -
388674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 0, //D2L, // -
389674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //D2F, // -
390674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 0, //I2B, // -
391674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 0, //I2C, // -
392674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 0, //I2S, // -
393674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -3, //LCMP, // -
394674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //FCMPL, // -
395674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //FCMPG, // -
396674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -3, //DCMPL, // -
397674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -3, //DCMPG, // -
398674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //IFEQ, // visitJumpInsn
399674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //IFNE, // -
400674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //IFLT, // -
401674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //IFGE, // -
402674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //IFGT, // -
403674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //IFLE, // -
404674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -2, //IF_ICMPEQ, // -
405674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -2, //IF_ICMPNE, // -
406674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -2, //IF_ICMPLT, // -
407674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -2, //IF_ICMPGE, // -
408674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -2, //IF_ICMPGT, // -
409674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -2, //IF_ICMPLE, // -
410674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -2, //IF_ACMPEQ, // -
411674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -2, //IF_ACMPNE, // -
412674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 0, //GOTO, // -
413674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 1, //JSR, // -
414674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 0, //RET, // visitVarInsn
415674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //TABLESWITCH, // visiTableSwitchInsn
416674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //LOOKUPSWITCH, // visitLookupSwitch
417674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //IRETURN, // visitInsn
418674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -2, //LRETURN, // -
419674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //FRETURN, // -
420674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -2, //DRETURN, // -
421674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //ARETURN, // -
422674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 0, //RETURN, // -
423674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //GETSTATIC, // visitFieldInsn
424674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //PUTSTATIC, // -
425674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //GETFIELD, // -
426674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //PUTFIELD, // -
427674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //INVOKEVIRTUAL, // visitMethodInsn
428674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //INVOKESPECIAL, // -
429674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //INVOKESTATIC, // -
430674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //INVOKEINTERFACE, // -
431674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //UNUSED, // NOT VISITED
432674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 1, //NEW, // visitTypeInsn
433674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 0, //NEWARRAY, // visitIntInsn
434674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 0, //ANEWARRAY, // visitTypeInsn
435674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 0, //ARRAYLENGTH, // visitInsn
436674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //ATHROW, // -
437674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 0, //CHECKCAST, // visitTypeInsn
438674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // 0, //INSTANCEOF, // -
439674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //MONITORENTER, // visitInsn
440674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //MONITOREXIT, // -
441674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //WIDE, // NOT VISITED
442674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //MULTIANEWARRAY, // visitMultiANewArrayInsn
443674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //IFNULL, // visitJumpInsn
444674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // -1, //IFNONNULL, // -
445674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //GOTO_W, // -
446674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // NA, //JSR_W, // -
447674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // };
448674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // for (i = 0; i < b.length; ++i) {
449674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // System.err.print((char)('E' + b[i]));
450674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // }
451674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // System.err.println();
452674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
453674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
454674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
455674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The label (i.e. basic block) to which these input and output stack map
456674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * frames correspond.
457674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
458674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    Label owner;
459674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
460674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
461674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The input stack map frame locals.
462674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
463674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    int[] inputLocals;
464674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
465674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
466674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The input stack map frame stack.
467674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
468674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    int[] inputStack;
469674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
470674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
471674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The output stack map frame locals.
472674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
473674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private int[] outputLocals;
474674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
475674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
476674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The output stack map frame stack.
477674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
478674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private int[] outputStack;
479674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
480674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
481674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Relative size of the output stack. The exact semantics of this field
482674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * depends on the algorithm that is used.
483674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
484674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * When only the maximum stack size is computed, this field is the size of
485674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * the output stack relatively to the top of the input stack.
486674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
487674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * When the stack map frames are completely computed, this field is the
488674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * actual number of types in {@link #outputStack}.
489674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
490674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private int outputStackTop;
491674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
492674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
493674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Number of types that are initialized in the basic block.
494674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
495674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @see #initializations
496674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
497674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private int initializationCount;
498674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
499674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
500674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * The types that are initialized in the basic block. A constructor
501674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * invocation on an UNINITIALIZED or UNINITIALIZED_THIS type must replace
502674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * <i>every occurence</i> of this type in the local variables and in the
503674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * operand stack. This cannot be done during the first phase of the
504674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * algorithm since, during this phase, the local variables and the operand
505674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * stack are not completely computed. It is therefore necessary to store the
506674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * types on which constructors are invoked in the basic block, in order to
507674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * do this replacement during the second phase of the algorithm, where the
508674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * frames are fully computed. Note that this array can contain types that
509674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * are relative to input locals or to the input stack (see below for the
510674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * description of the algorithm).
511674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
512674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private int[] initializations;
513674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
514674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
515674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Returns the output frame local variable type at the given index.
516674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
517674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param local the index of the local that must be returned.
518674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @return the output frame local variable type at the given index.
519674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
520674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private int get(final int local) {
521674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (outputLocals == null || local >= outputLocals.length) {
522674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            // this local has never been assigned in this basic block,
523674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            // so it is still equal to its value in the input frame
524674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            return LOCAL | local;
525674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } else {
526674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            int type = outputLocals[local];
527674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            if (type == 0) {
528674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                // this local has never been assigned in this basic block,
529674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                // so it is still equal to its value in the input frame
530674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                type = outputLocals[local] = LOCAL | local;
531674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            }
532674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            return type;
533674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
534674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
535674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
536674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
537674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Sets the output frame local variable type at the given index.
538674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
539674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param local the index of the local that must be set.
540674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param type the value of the local that must be set.
541674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
542674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private void set(final int local, final int type) {
543674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // creates and/or resizes the output local variables array if necessary
544674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (outputLocals == null) {
545674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            outputLocals = new int[10];
546674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
547674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        int n = outputLocals.length;
548674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (local >= n) {
549674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            int[] t = new int[Math.max(local + 1, 2 * n)];
550674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            System.arraycopy(outputLocals, 0, t, 0, n);
551674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            outputLocals = t;
552674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
553674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // sets the local variable
554674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        outputLocals[local] = type;
555674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
556674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
557674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
558674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Pushes a new type onto the output frame stack.
559674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
560674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param type the type that must be pushed.
561674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
562674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private void push(final int type) {
563674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // creates and/or resizes the output stack array if necessary
564674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (outputStack == null) {
565674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            outputStack = new int[10];
566674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
567674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        int n = outputStack.length;
568674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (outputStackTop >= n) {
569674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            int[] t = new int[Math.max(outputStackTop + 1, 2 * n)];
570674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            System.arraycopy(outputStack, 0, t, 0, n);
571674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            outputStack = t;
572674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
573674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // pushes the type on the output stack
574674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        outputStack[outputStackTop++] = type;
575674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // updates the maximun height reached by the output stack, if needed
576674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        int top = owner.inputStackTop + outputStackTop;
577674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (top > owner.outputStackMax) {
578674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            owner.outputStackMax = top;
579674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
580674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
581674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
582674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
583674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Pushes a new type onto the output frame stack.
584674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
585674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param cw the ClassWriter to which this label belongs.
586674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param desc the descriptor of the type to be pushed. Can also be a method
587674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *        descriptor (in this case this method pushes its return type onto
588674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *        the output frame stack).
589674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
590674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private void push(final ClassWriter cw, final String desc) {
591674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        int type = type(cw, desc);
592674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (type != 0) {
593674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            push(type);
594674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            if (type == LONG || type == DOUBLE) {
595674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(TOP);
596674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            }
597674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
598674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
599674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
600674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
601674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Returns the int encoding of the given type.
602674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
603674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param cw the ClassWriter to which this label belongs.
604674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param desc a type descriptor.
605674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @return the int encoding of the given type.
606674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
607674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private static int type(final ClassWriter cw, final String desc) {
608674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        String t;
609674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        int index = desc.charAt(0) == '(' ? desc.indexOf(')') + 1 : 0;
610674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        switch (desc.charAt(index)) {
611674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case 'V':
612674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                return 0;
613674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case 'Z':
614674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case 'C':
615674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case 'B':
616674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case 'S':
617674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case 'I':
618674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                return INTEGER;
619674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case 'F':
620674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                return FLOAT;
621674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case 'J':
622674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                return LONG;
623674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case 'D':
624674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                return DOUBLE;
625674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case 'L':
626674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                // stores the internal name, not the descriptor!
627674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                t = desc.substring(index + 1, desc.length() - 1);
628674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                return OBJECT | cw.addType(t);
629674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                // case '[':
630674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            default:
631674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                // extracts the dimensions and the element type
632674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                int data;
633674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                int dims = index + 1;
634674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                while (desc.charAt(dims) == '[') {
635674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    ++dims;
636674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                }
637674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                switch (desc.charAt(dims)) {
638674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    case 'Z':
639674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        data = BOOLEAN;
640674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        break;
641674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    case 'C':
642674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        data = CHAR;
643674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        break;
644674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    case 'B':
645674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        data = BYTE;
646674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        break;
647674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    case 'S':
648674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        data = SHORT;
649674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        break;
650674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    case 'I':
651674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        data = INTEGER;
652674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        break;
653674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    case 'F':
654674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        data = FLOAT;
655674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        break;
656674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    case 'J':
657674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        data = LONG;
658674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        break;
659674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    case 'D':
660674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        data = DOUBLE;
661674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        break;
662674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    // case 'L':
663674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    default:
664674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        // stores the internal name, not the descriptor
665674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        t = desc.substring(dims + 1, desc.length() - 1);
666674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        data = OBJECT | cw.addType(t);
667674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                }
668674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                return (dims - index) << 28 | data;
669674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
670674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
671674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
672674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
673674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Pops a type from the output frame stack and returns its value.
674674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
675674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @return the type that has been popped from the output frame stack.
676674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
677674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private int pop() {
678674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (outputStackTop > 0) {
679674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            return outputStack[--outputStackTop];
680674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } else {
681674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            // if the output frame stack is empty, pops from the input stack
682674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            return STACK | -(--owner.inputStackTop);
683674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
684674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
685674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
686674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
687674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Pops the given number of types from the output frame stack.
688674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
689674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param elements the number of types that must be popped.
690674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
691674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private void pop(final int elements) {
692674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (outputStackTop >= elements) {
693674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            outputStackTop -= elements;
694674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } else {
695674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            // if the number of elements to be popped is greater than the number
696674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            // of elements in the output stack, clear it, and pops the remaining
697674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            // elements from the input stack.
698674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            owner.inputStackTop -= elements - outputStackTop;
699674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            outputStackTop = 0;
700674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
701674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
702674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
703674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
704674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Pops a type from the output frame stack.
705674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
706674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param desc the descriptor of the type to be popped. Can also be a method
707674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *        descriptor (in this case this method pops the types corresponding
708674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *        to the method arguments).
709674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
710674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private void pop(final String desc) {
711674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        char c = desc.charAt(0);
712674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (c == '(') {
713674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            pop((MethodWriter.getArgumentsAndReturnSizes(desc) >> 2) - 1);
714674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } else if (c == 'J' || c == 'D') {
715674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            pop(2);
716674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } else {
717674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            pop(1);
718674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
719674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
720674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
721674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
722674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Adds a new type to the list of types on which a constructor is invoked in
723674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * the basic block.
724674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
725674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param var a type on a which a constructor is invoked.
726674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
727674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private void init(final int var) {
728674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // creates and/or resizes the initializations array if necessary
729674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (initializations == null) {
730674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            initializations = new int[2];
731674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
732674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        int n = initializations.length;
733674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (initializationCount >= n) {
734674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            int[] t = new int[Math.max(initializationCount + 1, 2 * n)];
735674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            System.arraycopy(initializations, 0, t, 0, n);
736674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            initializations = t;
737674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
738674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        // stores the type to be initialized
739674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        initializations[initializationCount++] = var;
740674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
741674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
742674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
743674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Replaces the given type with the appropriate type if it is one of the
744674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * types on which a constructor is invoked in the basic block.
745674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
746674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param cw the ClassWriter to which this label belongs.
747674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param t a type
748674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @return t or, if t is one of the types on which a constructor is invoked
749674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *         in the basic block, the type corresponding to this constructor.
750674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
751674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private int init(final ClassWriter cw, final int t) {
752674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        int s;
753674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (t == UNINITIALIZED_THIS) {
754674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            s = OBJECT | cw.addType(cw.thisName);
755674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } else if ((t & (DIM | BASE_KIND)) == UNINITIALIZED) {
756674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            String type = cw.typeTable[t & BASE_VALUE].strVal1;
757674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            s = OBJECT | cw.addType(type);
758674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } else {
759674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            return t;
760674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
761674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        for (int j = 0; j < initializationCount; ++j) {
762674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            int u = initializations[j];
763674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            int dim = u & DIM;
764674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            int kind = u & KIND;
765674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            if (kind == LOCAL) {
766674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                u = dim + inputLocals[u & VALUE];
767674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            } else if (kind == STACK) {
768674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                u = dim + inputStack[inputStack.length - (u & VALUE)];
769674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            }
770674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            if (t == u) {
771674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                return s;
772674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            }
773674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
774674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        return t;
775674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
776674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
777674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
778674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Initializes the input frame of the first basic block from the method
779674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * descriptor.
780674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
781674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param cw the ClassWriter to which this label belongs.
782674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param access the access flags of the method to which this label belongs.
783674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param args the formal parameter types of this method.
784674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param maxLocals the maximum number of local variables of this method.
785674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
786674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    void initInputFrame(
787674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final ClassWriter cw,
788674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final int access,
789674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final Type[] args,
790674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final int maxLocals)
791674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    {
792674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        inputLocals = new int[maxLocals];
793674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        inputStack = new int[0];
794674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        int i = 0;
795674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if ((access & Opcodes.ACC_STATIC) == 0) {
796674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            if ((access & MethodWriter.ACC_CONSTRUCTOR) == 0) {
797674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                inputLocals[i++] = OBJECT | cw.addType(cw.thisName);
798674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            } else {
799674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                inputLocals[i++] = UNINITIALIZED_THIS;
800674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            }
801674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
802674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        for (int j = 0; j < args.length; ++j) {
803674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            int t = type(cw, args[j].getDescriptor());
804674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            inputLocals[i++] = t;
805674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            if (t == LONG || t == DOUBLE) {
806674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                inputLocals[i++] = TOP;
807674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            }
808674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
809674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        while (i < maxLocals) {
810674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            inputLocals[i++] = TOP;
811674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
812674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
813674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
814674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
815674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Simulates the action of the given instruction on the output stack frame.
816674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
817674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param opcode the opcode of the instruction.
818674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param arg the operand of the instruction, if any.
819674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param cw the class writer to which this label belongs.
820674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param item the operand of the instructions, if any.
821674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
822674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    void execute(
823674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final int opcode,
824674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final int arg,
825674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final ClassWriter cw,
826674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final Item item)
827674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    {
828674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        int t1, t2, t3, t4;
829674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        switch (opcode) {
830674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.NOP:
831674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.INEG:
832674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.LNEG:
833674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.FNEG:
834674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.DNEG:
835674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.I2B:
836674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.I2C:
837674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.I2S:
838674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.GOTO:
839674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.RETURN:
840674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
841674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.ACONST_NULL:
842674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(NULL);
843674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
844674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.ICONST_M1:
845674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.ICONST_0:
846674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.ICONST_1:
847674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.ICONST_2:
848674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.ICONST_3:
849674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.ICONST_4:
850674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.ICONST_5:
851674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.BIPUSH:
852674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.SIPUSH:
853674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.ILOAD:
854674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(INTEGER);
855674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
856674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.LCONST_0:
857674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.LCONST_1:
858674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.LLOAD:
859674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(LONG);
860674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(TOP);
861674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
862674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.FCONST_0:
863674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.FCONST_1:
864674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.FCONST_2:
865674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.FLOAD:
866674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(FLOAT);
867674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
868674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.DCONST_0:
869674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.DCONST_1:
870674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.DLOAD:
871674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(DOUBLE);
872674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(TOP);
873674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
874674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.LDC:
875674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                switch (item.type) {
876674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    case ClassWriter.INT:
877674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        push(INTEGER);
878674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        break;
879674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    case ClassWriter.LONG:
880674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        push(LONG);
881674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        push(TOP);
882674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        break;
883674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    case ClassWriter.FLOAT:
884674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        push(FLOAT);
885674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        break;
886674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    case ClassWriter.DOUBLE:
887674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        push(DOUBLE);
888674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        push(TOP);
889674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        break;
890674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    case ClassWriter.CLASS:
891674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        push(OBJECT | cw.addType("java/lang/Class"));
892674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        break;
893674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    // case ClassWriter.STR:
894674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    default:
895674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        push(OBJECT | cw.addType("java/lang/String"));
896674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                }
897674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
898674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.ALOAD:
899674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(get(arg));
900674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
901674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.IALOAD:
902674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.BALOAD:
903674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.CALOAD:
904674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.SALOAD:
905674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                pop(2);
906674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(INTEGER);
907674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
908674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.LALOAD:
909674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.D2L:
910674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                pop(2);
911674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(LONG);
912674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(TOP);
913674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
914674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.FALOAD:
915674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                pop(2);
916674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(FLOAT);
917674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
918674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.DALOAD:
919674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.L2D:
920674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                pop(2);
921674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(DOUBLE);
922674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(TOP);
923674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
924674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.AALOAD:
925674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                pop(1);
926674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                t1 = pop();
927674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(ELEMENT_OF + t1);
928674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
929674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.ISTORE:
930674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.FSTORE:
931674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.ASTORE:
932674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                t1 = pop();
933674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                set(arg, t1);
934674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                if (arg > 0) {
935674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    t2 = get(arg - 1);
936674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    // if t2 is of kind STACK or LOCAL we cannot know its size!
937674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    if (t2 == LONG || t2 == DOUBLE) {
938674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        set(arg - 1, TOP);
939674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    }
940674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                }
941674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
942674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.LSTORE:
943674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.DSTORE:
944674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                pop(1);
945674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                t1 = pop();
946674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                set(arg, t1);
947674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                set(arg + 1, TOP);
948674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                if (arg > 0) {
949674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    t2 = get(arg - 1);
950674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    // if t2 is of kind STACK or LOCAL we cannot know its size!
951674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    if (t2 == LONG || t2 == DOUBLE) {
952674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        set(arg - 1, TOP);
953674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    }
954674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                }
955674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
956674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.IASTORE:
957674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.BASTORE:
958674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.CASTORE:
959674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.SASTORE:
960674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.FASTORE:
961674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.AASTORE:
962674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                pop(3);
963674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
964674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.LASTORE:
965674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.DASTORE:
966674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                pop(4);
967674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
968674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.POP:
969674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.IFEQ:
970674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.IFNE:
971674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.IFLT:
972674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.IFGE:
973674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.IFGT:
974674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.IFLE:
975674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.IRETURN:
976674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.FRETURN:
977674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.ARETURN:
978674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.TABLESWITCH:
979674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.LOOKUPSWITCH:
980674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.ATHROW:
981674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.MONITORENTER:
982674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.MONITOREXIT:
983674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.IFNULL:
984674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.IFNONNULL:
985674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                pop(1);
986674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
987674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.POP2:
988674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.IF_ICMPEQ:
989674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.IF_ICMPNE:
990674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.IF_ICMPLT:
991674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.IF_ICMPGE:
992674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.IF_ICMPGT:
993674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.IF_ICMPLE:
994674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.IF_ACMPEQ:
995674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.IF_ACMPNE:
996674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.LRETURN:
997674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.DRETURN:
998674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                pop(2);
999674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
1000674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.DUP:
1001674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                t1 = pop();
1002674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(t1);
1003674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(t1);
1004674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
1005674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.DUP_X1:
1006674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                t1 = pop();
1007674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                t2 = pop();
1008674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(t1);
1009674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(t2);
1010674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(t1);
1011674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
1012674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.DUP_X2:
1013674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                t1 = pop();
1014674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                t2 = pop();
1015674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                t3 = pop();
1016674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(t1);
1017674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(t3);
1018674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(t2);
1019674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(t1);
1020674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
1021674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.DUP2:
1022674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                t1 = pop();
1023674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                t2 = pop();
1024674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(t2);
1025674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(t1);
1026674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(t2);
1027674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(t1);
1028674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
1029674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.DUP2_X1:
1030674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                t1 = pop();
1031674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                t2 = pop();
1032674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                t3 = pop();
1033674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(t2);
1034674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(t1);
1035674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(t3);
1036674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(t2);
1037674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(t1);
1038674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
1039674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.DUP2_X2:
1040674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                t1 = pop();
1041674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                t2 = pop();
1042674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                t3 = pop();
1043674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                t4 = pop();
1044674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(t2);
1045674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(t1);
1046674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(t4);
1047674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(t3);
1048674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(t2);
1049674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(t1);
1050674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
1051674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.SWAP:
1052674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                t1 = pop();
1053674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                t2 = pop();
1054674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(t1);
1055674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(t2);
1056674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
1057674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.IADD:
1058674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.ISUB:
1059674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.IMUL:
1060674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.IDIV:
1061674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.IREM:
1062674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.IAND:
1063674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.IOR:
1064674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.IXOR:
1065674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.ISHL:
1066674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.ISHR:
1067674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.IUSHR:
1068674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.L2I:
1069674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.D2I:
1070674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.FCMPL:
1071674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.FCMPG:
1072674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                pop(2);
1073674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(INTEGER);
1074674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
1075674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.LADD:
1076674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.LSUB:
1077674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.LMUL:
1078674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.LDIV:
1079674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.LREM:
1080674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.LAND:
1081674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.LOR:
1082674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.LXOR:
1083674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                pop(4);
1084674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(LONG);
1085674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(TOP);
1086674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
1087674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.FADD:
1088674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.FSUB:
1089674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.FMUL:
1090674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.FDIV:
1091674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.FREM:
1092674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.L2F:
1093674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.D2F:
1094674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                pop(2);
1095674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(FLOAT);
1096674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
1097674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.DADD:
1098674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.DSUB:
1099674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.DMUL:
1100674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.DDIV:
1101674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.DREM:
1102674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                pop(4);
1103674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(DOUBLE);
1104674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(TOP);
1105674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
1106674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.LSHL:
1107674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.LSHR:
1108674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.LUSHR:
1109674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                pop(3);
1110674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(LONG);
1111674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(TOP);
1112674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
1113674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.IINC:
1114674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                set(arg, INTEGER);
1115674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
1116674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.I2L:
1117674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.F2L:
1118674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                pop(1);
1119674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(LONG);
1120674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(TOP);
1121674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
1122674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.I2F:
1123674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                pop(1);
1124674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(FLOAT);
1125674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
1126674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.I2D:
1127674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.F2D:
1128674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                pop(1);
1129674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(DOUBLE);
1130674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(TOP);
1131674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
1132674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.F2I:
1133674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.ARRAYLENGTH:
1134674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.INSTANCEOF:
1135674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                pop(1);
1136674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(INTEGER);
1137674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
1138674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.LCMP:
1139674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.DCMPL:
1140674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.DCMPG:
1141674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                pop(4);
1142674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(INTEGER);
1143674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
1144674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.JSR:
1145674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.RET:
1146674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                throw new RuntimeException("JSR/RET are not supported with computeFrames option");
1147674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.GETSTATIC:
1148674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(cw, item.strVal3);
1149674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
1150674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.PUTSTATIC:
1151674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                pop(item.strVal3);
1152674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
1153674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.GETFIELD:
1154674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                pop(1);
1155674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(cw, item.strVal3);
1156674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
1157674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.PUTFIELD:
1158674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                pop(item.strVal3);
1159674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                pop();
1160674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
1161674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.INVOKEVIRTUAL:
1162674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.INVOKESPECIAL:
1163674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.INVOKESTATIC:
1164674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.INVOKEINTERFACE:
1165674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                pop(item.strVal3);
1166674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                if (opcode != Opcodes.INVOKESTATIC) {
1167674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    t1 = pop();
1168674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    if (opcode == Opcodes.INVOKESPECIAL
1169674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                            && item.strVal2.charAt(0) == '<')
1170674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    {
1171674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        init(t1);
1172674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    }
1173674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                }
1174674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(cw, item.strVal3);
1175674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
1176674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.NEW:
1177674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(UNINITIALIZED | cw.addUninitializedType(item.strVal1, arg));
1178674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
1179674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.NEWARRAY:
1180674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                pop();
1181674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                switch (arg) {
1182674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    case Opcodes.T_BOOLEAN:
1183674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        push(ARRAY_OF | BOOLEAN);
1184674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        break;
1185674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    case Opcodes.T_CHAR:
1186674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        push(ARRAY_OF | CHAR);
1187674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        break;
1188674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    case Opcodes.T_BYTE:
1189674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        push(ARRAY_OF | BYTE);
1190674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        break;
1191674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    case Opcodes.T_SHORT:
1192674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        push(ARRAY_OF | SHORT);
1193674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        break;
1194674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    case Opcodes.T_INT:
1195674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        push(ARRAY_OF | INTEGER);
1196674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        break;
1197674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    case Opcodes.T_FLOAT:
1198674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        push(ARRAY_OF | FLOAT);
1199674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        break;
1200674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    case Opcodes.T_DOUBLE:
1201674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        push(ARRAY_OF | DOUBLE);
1202674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        break;
1203674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    // case Opcodes.T_LONG:
1204674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    default:
1205674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        push(ARRAY_OF | LONG);
1206674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        break;
1207674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                }
1208674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
1209674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.ANEWARRAY:
1210674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                String s = item.strVal1;
1211674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                pop();
1212674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                if (s.charAt(0) == '[') {
1213674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    push(cw, '[' + s);
1214674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                } else {
1215674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    push(ARRAY_OF | OBJECT | cw.addType(s));
1216674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                }
1217674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
1218674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            case Opcodes.CHECKCAST:
1219674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                s = item.strVal1;
1220674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                pop();
1221674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                if (s.charAt(0) == '[') {
1222674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    push(cw, s);
1223674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                } else {
1224674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    push(OBJECT | cw.addType(s));
1225674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                }
1226674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
1227674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            // case Opcodes.MULTIANEWARRAY:
1228674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            default:
1229674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                pop(arg);
1230674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                push(cw, item.strVal1);
1231674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                break;
1232674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
1233674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
1234674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
1235674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
1236674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Merges the input frame of the given basic block with the input and output
1237674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * frames of this basic block. Returns <tt>true</tt> if the input frame of
1238674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * the given label has been changed by this operation.
1239674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
1240674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param cw the ClassWriter to which this label belongs.
1241674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param frame the basic block whose input frame must be updated.
1242674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param edge the kind of the {@link Edge} between this label and 'label'.
1243674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *        See {@link Edge#info}.
1244674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @return <tt>true</tt> if the input frame of the given label has been
1245674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *         changed by this operation.
1246674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
1247674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    boolean merge(final ClassWriter cw, final Frame frame, final int edge) {
1248674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        boolean changed = false;
1249674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        int i, s, dim, kind, t;
1250674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
1251674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        int nLocal = inputLocals.length;
1252674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        int nStack = inputStack.length;
1253674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (frame.inputLocals == null) {
1254674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            frame.inputLocals = new int[nLocal];
1255674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            changed = true;
1256674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
1257674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
1258674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        for (i = 0; i < nLocal; ++i) {
1259674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            if (outputLocals != null && i < outputLocals.length) {
1260674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                s = outputLocals[i];
1261674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                if (s == 0) {
1262674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    t = inputLocals[i];
1263674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                } else {
1264674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    dim = s & DIM;
1265674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    kind = s & KIND;
1266674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    if (kind == LOCAL) {
1267674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        t = dim + inputLocals[s & VALUE];
1268674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    } else if (kind == STACK) {
1269674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        t = dim + inputStack[nStack - (s & VALUE)];
1270674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    } else {
1271674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                        t = s;
1272674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    }
1273674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                }
1274674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            } else {
1275674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                t = inputLocals[i];
1276674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            }
1277674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            if (initializations != null) {
1278674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                t = init(cw, t);
1279674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            }
1280674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            changed |= merge(cw, t, frame.inputLocals, i);
1281674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
1282674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
1283674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (edge > 0) {
1284674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            for (i = 0; i < nLocal; ++i) {
1285674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                t = inputLocals[i];
1286674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                changed |= merge(cw, t, frame.inputLocals, i);
1287674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            }
1288674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            if (frame.inputStack == null) {
1289674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                frame.inputStack = new int[1];
1290674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                changed = true;
1291674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            }
1292674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            changed |= merge(cw, edge, frame.inputStack, 0);
1293674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            return changed;
1294674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
1295674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
1296674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        int nInputStack = inputStack.length + owner.inputStackTop;
1297674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (frame.inputStack == null) {
1298674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            frame.inputStack = new int[nInputStack + outputStackTop];
1299674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            changed = true;
1300674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
1301674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
1302674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        for (i = 0; i < nInputStack; ++i) {
1303674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            t = inputStack[i];
1304674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            if (initializations != null) {
1305674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                t = init(cw, t);
1306674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            }
1307674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            changed |= merge(cw, t, frame.inputStack, i);
1308674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
1309674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        for (i = 0; i < outputStackTop; ++i) {
1310674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            s = outputStack[i];
1311674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            dim = s & DIM;
1312674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            kind = s & KIND;
1313674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            if (kind == LOCAL) {
1314674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                t = dim + inputLocals[s & VALUE];
1315674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            } else if (kind == STACK) {
1316674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                t = dim + inputStack[nStack - (s & VALUE)];
1317674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            } else {
1318674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                t = s;
1319674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            }
1320674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            if (initializations != null) {
1321674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                t = init(cw, t);
1322674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            }
1323674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            changed |= merge(cw, t, frame.inputStack, nInputStack + i);
1324674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
1325674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        return changed;
1326674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
1327674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
1328674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    /**
1329674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * Merges the type at the given index in the given type array with the given
1330674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * type. Returns <tt>true</tt> if the type array has been modified by this
1331674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * operation.
1332674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *
1333674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param cw the ClassWriter to which this label belongs.
1334674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param t the type with which the type array element must be merged.
1335674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param types an array of types.
1336674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @param index the index of the type that must be merged in 'types'.
1337674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     * @return <tt>true</tt> if the type array has been modified by this
1338674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     *         operation.
1339674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen     */
1340674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private static boolean merge(
1341674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final ClassWriter cw,
1342674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        int t,
1343674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final int[] types,
1344674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        final int index)
1345674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    {
1346674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        int u = types[index];
1347674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (u == t) {
1348674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            // if the types are equal, merge(u,t)=u, so there is no change
1349674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            return false;
1350674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
1351674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if ((t & ~DIM) == NULL) {
1352674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            if (u == NULL) {
1353674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                return false;
1354674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            }
1355674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            t = NULL;
1356674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
1357674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (u == 0) {
1358674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            // if types[index] has never been assigned, merge(u,t)=t
1359674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            types[index] = t;
1360674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            return true;
1361674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
1362674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        int v;
1363674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if ((u & BASE_KIND) == OBJECT || (u & DIM) != 0) {
1364674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            // if u is a reference type of any dimension
1365674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            if (t == NULL) {
1366674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                // if t is the NULL type, merge(u,t)=u, so there is no change
1367674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                return false;
1368674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            } else if ((t & (DIM | BASE_KIND)) == (u & (DIM | BASE_KIND))) {
1369674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                if ((u & BASE_KIND) == OBJECT) {
1370674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    // if t is also a reference type, and if u and t have the
1371674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    // same dimension merge(u,t) = dim(t) | common parent of the
1372674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    // element types of u and t
1373674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    v = (t & DIM) | OBJECT
1374674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                            | cw.getMergedType(t & BASE_VALUE, u & BASE_VALUE);
1375674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                } else {
1376674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    // if u and t are array types, but not with the same element
1377674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    // type, merge(u,t)=java/lang/Object
1378674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    v = OBJECT | cw.addType("java/lang/Object");
1379674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                }
1380674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            } else if ((t & BASE_KIND) == OBJECT || (t & DIM) != 0) {
1381674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                // if t is any other reference or array type,
1382674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                // merge(u,t)=java/lang/Object
1383674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                v = OBJECT | cw.addType("java/lang/Object");
1384674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            } else {
1385674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                // if t is any other type, merge(u,t)=TOP
1386674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                v = TOP;
1387674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            }
1388674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } else if (u == NULL) {
1389674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            // if u is the NULL type, merge(u,t)=t,
1390674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            // or TOP if t is not a reference type
1391674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            v = (t & BASE_KIND) == OBJECT || (t & DIM) != 0 ? t : TOP;
1392674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        } else {
1393674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            // if u is any other type, merge(u,t)=TOP whatever t
1394674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            v = TOP;
1395674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
1396674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        if (u != v) {
1397674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            types[index] = v;
1398674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            return true;
1399674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
1400674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        return false;
1401674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
1402674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen}
1403