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.tree.analysis; 31674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 32674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport java.util.List; 33674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 34674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.Opcodes; 35674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.Type; 36674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.tree.AbstractInsnNode; 37674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.tree.FieldInsnNode; 38674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.tree.IntInsnNode; 39674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.tree.LdcInsnNode; 40674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.tree.MethodInsnNode; 41674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.tree.MultiANewArrayInsnNode; 42674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.tree.TypeInsnNode; 43674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 44674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen/** 45674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * An {@link Interpreter} for {@link BasicValue} values. 46674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * 47674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @author Eric Bruneton 48674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * @author Bing Ran 49674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */ 50674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenpublic class BasicInterpreter implements Opcodes, Interpreter { 51674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 52674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public Value newValue(final Type type) { 53674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (type == null) { 54674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BasicValue.UNINITIALIZED_VALUE; 55674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 56674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen switch (type.getSort()) { 57674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case Type.VOID: 58674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return null; 59674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case Type.BOOLEAN: 60674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case Type.CHAR: 61674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case Type.BYTE: 62674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case Type.SHORT: 63674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case Type.INT: 64674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BasicValue.INT_VALUE; 65674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case Type.FLOAT: 66674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BasicValue.FLOAT_VALUE; 67674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case Type.LONG: 68674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BasicValue.LONG_VALUE; 69674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case Type.DOUBLE: 70674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BasicValue.DOUBLE_VALUE; 71674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case Type.ARRAY: 72674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case Type.OBJECT: 73674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BasicValue.REFERENCE_VALUE; 74674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen default: 75674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen throw new Error("Internal error"); 76674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 77674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 78674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 79674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public Value newOperation(final AbstractInsnNode insn) { 80674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen switch (insn.getOpcode()) { 81674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case ACONST_NULL: 82674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return newValue(Type.getObjectType("null")); 83674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case ICONST_M1: 84674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case ICONST_0: 85674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case ICONST_1: 86674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case ICONST_2: 87674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case ICONST_3: 88674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case ICONST_4: 89674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case ICONST_5: 90674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BasicValue.INT_VALUE; 91674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case LCONST_0: 92674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case LCONST_1: 93674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BasicValue.LONG_VALUE; 94674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case FCONST_0: 95674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case FCONST_1: 96674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case FCONST_2: 97674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BasicValue.FLOAT_VALUE; 98674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case DCONST_0: 99674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case DCONST_1: 100674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BasicValue.DOUBLE_VALUE; 101674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case BIPUSH: 102674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case SIPUSH: 103674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BasicValue.INT_VALUE; 104674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case LDC: 105674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen Object cst = ((LdcInsnNode) insn).cst; 106674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (cst instanceof Integer) { 107674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BasicValue.INT_VALUE; 108674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } else if (cst instanceof Float) { 109674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BasicValue.FLOAT_VALUE; 110674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } else if (cst instanceof Long) { 111674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BasicValue.LONG_VALUE; 112674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } else if (cst instanceof Double) { 113674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BasicValue.DOUBLE_VALUE; 114674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } else if (cst instanceof Type) { 115674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return newValue(Type.getObjectType("java/lang/Class")); 116674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } else { 117674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return newValue(Type.getType(cst.getClass())); 118674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 119674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case JSR: 120674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BasicValue.RETURNADDRESS_VALUE; 121674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case GETSTATIC: 122674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return newValue(Type.getType(((FieldInsnNode) insn).desc)); 123674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case NEW: 124674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return newValue(Type.getObjectType(((TypeInsnNode) insn).desc)); 125674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen default: 126674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen throw new Error("Internal error."); 127674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 128674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 129674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 130674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public Value copyOperation(final AbstractInsnNode insn, final Value value) 131674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen throws AnalyzerException 132674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen { 133674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return value; 134674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 135674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 136674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public Value unaryOperation(final AbstractInsnNode insn, final Value value) 137674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen throws AnalyzerException 138674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen { 139674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen switch (insn.getOpcode()) { 140674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case INEG: 141674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case IINC: 142674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case L2I: 143674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case F2I: 144674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case D2I: 145674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case I2B: 146674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case I2C: 147674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case I2S: 148674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BasicValue.INT_VALUE; 149674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case FNEG: 150674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case I2F: 151674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case L2F: 152674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case D2F: 153674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BasicValue.FLOAT_VALUE; 154674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case LNEG: 155674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case I2L: 156674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case F2L: 157674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case D2L: 158674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BasicValue.LONG_VALUE; 159674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case DNEG: 160674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case I2D: 161674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case L2D: 162674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case F2D: 163674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BasicValue.DOUBLE_VALUE; 164674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case IFEQ: 165674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case IFNE: 166674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case IFLT: 167674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case IFGE: 168674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case IFGT: 169674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case IFLE: 170674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case TABLESWITCH: 171674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case LOOKUPSWITCH: 172674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case IRETURN: 173674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case LRETURN: 174674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case FRETURN: 175674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case DRETURN: 176674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case ARETURN: 177674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case PUTSTATIC: 178674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return null; 179674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case GETFIELD: 180674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return newValue(Type.getType(((FieldInsnNode) insn).desc)); 181674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case NEWARRAY: 182674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen switch (((IntInsnNode) insn).operand) { 183674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case T_BOOLEAN: 184674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return newValue(Type.getType("[Z")); 185674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case T_CHAR: 186674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return newValue(Type.getType("[C")); 187674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case T_BYTE: 188674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return newValue(Type.getType("[B")); 189674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case T_SHORT: 190674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return newValue(Type.getType("[S")); 191674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case T_INT: 192674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return newValue(Type.getType("[I")); 193674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case T_FLOAT: 194674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return newValue(Type.getType("[F")); 195674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case T_DOUBLE: 196674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return newValue(Type.getType("[D")); 197674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case T_LONG: 198674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return newValue(Type.getType("[J")); 199674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen default: 200674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen throw new AnalyzerException("Invalid array type"); 201674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 202674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case ANEWARRAY: 203674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen String desc = ((TypeInsnNode) insn).desc; 204674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return newValue(Type.getType("[" + Type.getObjectType(desc))); 205674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case ARRAYLENGTH: 206674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BasicValue.INT_VALUE; 207674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case ATHROW: 208674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return null; 209674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case CHECKCAST: 210674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen desc = ((TypeInsnNode) insn).desc; 211674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return newValue(Type.getObjectType(desc)); 212674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case INSTANCEOF: 213674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BasicValue.INT_VALUE; 214674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case MONITORENTER: 215674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case MONITOREXIT: 216674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case IFNULL: 217674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case IFNONNULL: 218674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return null; 219674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen default: 220674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen throw new Error("Internal error."); 221674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 222674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 223674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 224674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public Value binaryOperation( 225674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final AbstractInsnNode insn, 226674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final Value value1, 227674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final Value value2) throws AnalyzerException 228674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen { 229674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen switch (insn.getOpcode()) { 230674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case IALOAD: 231674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case BALOAD: 232674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case CALOAD: 233674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case SALOAD: 234674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case IADD: 235674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case ISUB: 236674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case IMUL: 237674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case IDIV: 238674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case IREM: 239674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case ISHL: 240674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case ISHR: 241674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case IUSHR: 242674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case IAND: 243674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case IOR: 244674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case IXOR: 245674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BasicValue.INT_VALUE; 246674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case FALOAD: 247674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case FADD: 248674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case FSUB: 249674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case FMUL: 250674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case FDIV: 251674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case FREM: 252674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BasicValue.FLOAT_VALUE; 253674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case LALOAD: 254674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case LADD: 255674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case LSUB: 256674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case LMUL: 257674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case LDIV: 258674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case LREM: 259674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case LSHL: 260674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case LSHR: 261674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case LUSHR: 262674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case LAND: 263674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case LOR: 264674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case LXOR: 265674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BasicValue.LONG_VALUE; 266674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case DALOAD: 267674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case DADD: 268674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case DSUB: 269674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case DMUL: 270674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case DDIV: 271674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case DREM: 272674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BasicValue.DOUBLE_VALUE; 273674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case AALOAD: 274674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BasicValue.REFERENCE_VALUE; 275674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case LCMP: 276674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case FCMPL: 277674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case FCMPG: 278674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case DCMPL: 279674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case DCMPG: 280674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BasicValue.INT_VALUE; 281674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case IF_ICMPEQ: 282674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case IF_ICMPNE: 283674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case IF_ICMPLT: 284674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case IF_ICMPGE: 285674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case IF_ICMPGT: 286674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case IF_ICMPLE: 287674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case IF_ACMPEQ: 288674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case IF_ACMPNE: 289674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen case PUTFIELD: 290674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return null; 291674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen default: 292674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen throw new Error("Internal error."); 293674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 294674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 295674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 296674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public Value ternaryOperation( 297674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final AbstractInsnNode insn, 298674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final Value value1, 299674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final Value value2, 300674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen final Value value3) throws AnalyzerException 301674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen { 302674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return null; 303674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 304674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 305674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public Value naryOperation(final AbstractInsnNode insn, final List values) 306674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen throws AnalyzerException 307674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen { 308674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (insn.getOpcode() == MULTIANEWARRAY) { 309674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return newValue(Type.getType(((MultiANewArrayInsnNode) insn).desc)); 310674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } else { 311674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return newValue(Type.getReturnType(((MethodInsnNode) insn).desc)); 312674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 313674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 314674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen 315674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen public Value merge(final Value v, final Value w) { 316674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen if (!v.equals(w)) { 317674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return BasicValue.UNINITIALIZED_VALUE; 318674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 319674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen return v; 320674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen } 321674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen} 322