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