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