1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/*
2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification
3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *             of Java bytecode.
4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
5b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu)
6b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
7b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is free software; you can redistribute it and/or modify it
8b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * under the terms of the GNU General Public License as published by the Free
9b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Software Foundation; either version 2 of the License, or (at your option)
10b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * any later version.
11b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
12b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is distributed in the hope that it will be useful, but WITHOUT
13b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * more details.
16b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
17b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * You should have received a copy of the GNU General Public License along
18b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * with this program; if not, write to the Free Software Foundation, Inc.,
19b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */
21b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopackage proguard.evaluation;
22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
23b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.*;
24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.CodeAttribute;
25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.constant.*;
26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.constant.visitor.ConstantVisitor;
27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.instruction.*;
28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.instruction.visitor.InstructionVisitor;
29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.util.SimplifiedVisitor;
30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.evaluation.value.*;
31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/**
33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This InstructionVisitor executes the instructions that it visits on a given
34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * local variable frame and stack.
35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune
37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */
38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopublic class Processor
39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoextends      SimplifiedVisitor
40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimplements   InstructionVisitor,
41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             ConstantVisitor
42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{
43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private final Variables      variables;
44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private final Stack          stack;
45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private final ValueFactory   valueFactory;
46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private final BranchUnit     branchUnit;
47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private final InvocationUnit invocationUnit;
48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Fields acting as parameters for the ConstantVisitor methods.
50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private boolean handleClassConstantAsClassValue;
51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private Value   cpValue;
52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Creates a new processor that operates on the given environment.
56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param variables      the local variable frame.
57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param stack          the local stack.
58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param branchUnit     the class that can affect the program counter.
59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param invocationUnit the class that can access other program members.
60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public Processor(Variables      variables,
62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                     Stack          stack,
63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                     ValueFactory   valueFactory,
64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                     BranchUnit     branchUnit,
65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                     InvocationUnit invocationUnit)
66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        this.variables      = variables;
68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        this.stack          = stack;
69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        this.valueFactory   = valueFactory;
70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        this.branchUnit     = branchUnit;
71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        this.invocationUnit = invocationUnit;
72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for InstructionVisitor.
76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction)
78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        switch (simpleInstruction.opcode)
80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_NOP:
82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ACONST_NULL:
85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(valueFactory.createReferenceValueNull());
86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_M1:
89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_0:
90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_1:
91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_2:
92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_3:
93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_4:
94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_5:
95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_BIPUSH:
96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_SIPUSH:
97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(valueFactory.createIntegerValue(simpleInstruction.constant));
98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LCONST_0:
101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LCONST_1:
102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(valueFactory.createLongValue(simpleInstruction.constant));
103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FCONST_0:
106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FCONST_1:
107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FCONST_2:
108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(valueFactory.createFloatValue((float)simpleInstruction.constant));
109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DCONST_0:
112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DCONST_1:
113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(valueFactory.createDoubleValue((double)simpleInstruction.constant));
114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IALOAD:
117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_BALOAD:
118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_CALOAD:
119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_SALOAD:
120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.ipop();
121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.apop();
122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(valueFactory.createIntegerValue());
123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LALOAD:
126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.ipop();
127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.apop();
128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(valueFactory.createLongValue());
129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FALOAD:
132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.ipop();
133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.apop();
134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(valueFactory.createFloatValue());
135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DALOAD:
138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.ipop();
139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.apop();
140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(valueFactory.createDoubleValue());
141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_AALOAD:
144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                IntegerValue   arrayIndex     = stack.ipop();
146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                ReferenceValue arrayReference = stack.apop();
147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(arrayReference.arrayLoad(arrayIndex, valueFactory));
148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IASTORE:
152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_BASTORE:
153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_CASTORE:
154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_SASTORE:
155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.ipop();
156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.ipop();
157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.apop();
158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LASTORE:
161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.lpop();
162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.ipop();
163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.apop();
164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FASTORE:
167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.fpop();
168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.ipop();
169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.apop();
170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DASTORE:
173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.dpop();
174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.ipop();
175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.apop();
176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_AASTORE:
179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.apop();
180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.ipop();
181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.apop();
182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_POP:
185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.pop1();
186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_POP2:
189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.pop2();
190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DUP:
193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.dup();
194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DUP_X1:
197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.dup_x1();
198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DUP_X2:
201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.dup_x2();
202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DUP2:
205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.dup2();
206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DUP2_X1:
209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.dup2_x1();
210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DUP2_X2:
213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.dup2_x2();
214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_SWAP:
217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.swap();
218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IADD:
221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().add(stack.ipop()));
222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LADD:
225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.lpop().add(stack.lpop()));
226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FADD:
229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.fpop().add(stack.fpop()));
230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DADD:
233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.dpop().add(stack.dpop()));
234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ISUB:
237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().subtractFrom(stack.ipop()));
238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LSUB:
241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.lpop().subtractFrom(stack.lpop()));
242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FSUB:
245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.fpop().subtractFrom(stack.fpop()));
246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DSUB:
249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.dpop().subtractFrom(stack.dpop()));
250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
252b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IMUL:
253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().multiply(stack.ipop()));
254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
255b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LMUL:
257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.lpop().multiply(stack.lpop()));
258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
259b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
260b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FMUL:
261b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.fpop().multiply(stack.fpop()));
262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
264b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DMUL:
265b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.dpop().multiply(stack.dpop()));
266b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
267b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
268b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IDIV:
269b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                try
270b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
271b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.push(stack.ipop().divideOf(stack.ipop()));
272b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
273b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                catch (ArithmeticException ex)
274b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
275b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.push(valueFactory.createIntegerValue());
276b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    // TODO: Forward ArithmeticExceptions.
277b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    //stack.clear();
278b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    //stack.push(valueFactory.createReference(false));
279b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    //branchUnit.throwException();
280b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
281b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
282b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
283b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LDIV:
284b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                try
285b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
286b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.push(stack.lpop().divideOf(stack.lpop()));
287b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
288b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                catch (ArithmeticException ex)
289b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
290b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.push(valueFactory.createLongValue());
291b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    // TODO: Forward ArithmeticExceptions.
292b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    //stack.clear();
293b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    //stack.push(valueFactory.createReference(false));
294b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    //branchUnit.throwException();
295b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
296b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
297b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
298b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FDIV:
299b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.fpop().divideOf(stack.fpop()));
300b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
301b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
302b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DDIV:
303b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.dpop().divideOf(stack.dpop()));
304b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
305b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
306b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IREM:
307b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                try
308b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
309b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.push(stack.ipop().remainderOf(stack.ipop()));
310b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
311b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                catch (ArithmeticException ex)
312b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
313b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.push(valueFactory.createIntegerValue());
314b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    // TODO: Forward ArithmeticExceptions.
315b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    //stack.clear();
316b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    //stack.push(valueFactory.createReference(false));
317b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    //branchUnit.throwException();
318b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
319b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
320b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
321b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LREM:
322b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                try
323b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
324b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.push(stack.lpop().remainderOf(stack.lpop()));
325b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
326b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                catch (ArithmeticException ex)
327b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
328b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.push(valueFactory.createLongValue());
329b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    // TODO: Forward ArithmeticExceptions.
330b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    //stack.clear();
331b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    //stack.push(valueFactory.createReference(false));
332b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    //branchUnit.throwException();
333b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
334b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
335b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
336b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FREM:
337b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.fpop().remainderOf(stack.fpop()));
338b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
339b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
340b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DREM:
341b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.dpop().remainderOf(stack.dpop()));
342b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
343b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
344b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_INEG:
345b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().negate());
346b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
347b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
348b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LNEG:
349b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.lpop().negate());
350b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
351b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
352b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FNEG:
353b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.fpop().negate());
354b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
355b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
356b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DNEG:
357b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.dpop().negate());
358b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
359b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
360b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ISHL:
361b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().shiftLeftOf(stack.ipop()));
362b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
363b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
364b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LSHL:
365b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().shiftLeftOf(stack.lpop()));
366b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
367b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
368b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ISHR:
369b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().shiftRightOf(stack.ipop()));
370b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
371b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
372b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LSHR:
373b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().shiftRightOf(stack.lpop()));
374b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
375b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
376b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IUSHR:
377b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().unsignedShiftRightOf(stack.ipop()));
378b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
379b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
380b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LUSHR:
381b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().unsignedShiftRightOf(stack.lpop()));
382b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
383b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
384b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IAND:
385b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().and(stack.ipop()));
386b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
387b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
388b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LAND:
389b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.lpop().and(stack.lpop()));
390b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
391b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
392b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IOR:
393b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().or(stack.ipop()));
394b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
395b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
396b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LOR:
397b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.lpop().or(stack.lpop()));
398b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
399b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
400b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IXOR:
401b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().xor(stack.ipop()));
402b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
403b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
404b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LXOR:
405b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.lpop().xor(stack.lpop()));
406b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
407b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
408b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_I2L:
409b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().convertToLong());
410b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
411b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
412b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_I2F:
413b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().convertToFloat());
414b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
415b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
416b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_I2D:
417b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().convertToDouble());
418b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
419b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
420b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_L2I:
421b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.lpop().convertToInteger());
422b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
423b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
424b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_L2F:
425b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.lpop().convertToFloat());
426b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
427b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
428b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_L2D:
429b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.lpop().convertToDouble());
430b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
431b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
432b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_F2I:
433b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.fpop().convertToInteger());
434b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
435b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
436b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_F2L:
437b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.fpop().convertToLong());
438b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
439b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
440b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_F2D:
441b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.fpop().convertToDouble());
442b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
443b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
444b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_D2I:
445b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.dpop().convertToInteger());
446b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
447b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
448b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_D2L:
449b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.dpop().convertToLong());
450b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
451b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
452b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_D2F:
453b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.dpop().convertToFloat());
454b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
455b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
456b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_I2B:
457b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().convertToByte());
458b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
459b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
460b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_I2C:
461b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().convertToCharacter());
462b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
463b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
464b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_I2S:
465b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().convertToShort());
466b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
467b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
468b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LCMP:
469b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//                stack.push(stack.lpop().compareReverse(stack.lpop()));
470b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
471b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                LongValue longValue1 = stack.lpop();
472b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                LongValue longValue2 = stack.lpop();
473b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(longValue2.compare(longValue1));
474b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
475b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
476b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FCMPL:
477b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                FloatValue floatValue1 = stack.fpop();
478b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                FloatValue floatValue2 = stack.fpop();
479b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(floatValue2.compare(floatValue1));
480b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
481b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
482b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FCMPG:
483b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.fpop().compareReverse(stack.fpop()));
484b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
485b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
486b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DCMPL:
487b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                DoubleValue doubleValue1 = stack.dpop();
488b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                DoubleValue doubleValue2 = stack.dpop();
489b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(doubleValue2.compare(doubleValue1));
490b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
491b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
492b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DCMPG:
493b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.dpop().compareReverse(stack.dpop()));
494b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
495b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
496b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IRETURN:
497b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                invocationUnit.exitMethod(clazz, method, stack.ipop());
498b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.returnFromMethod();
499b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
500b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
501b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LRETURN:
502b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                invocationUnit.exitMethod(clazz, method, stack.lpop());
503b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.returnFromMethod();
504b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
505b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
506b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FRETURN:
507b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                invocationUnit.exitMethod(clazz, method, stack.fpop());
508b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.returnFromMethod();
509b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
510b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
511b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DRETURN:
512b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                invocationUnit.exitMethod(clazz, method, stack.dpop());
513b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.returnFromMethod();
514b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
515b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
516b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ARETURN:
517b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                invocationUnit.exitMethod(clazz, method, stack.apop());
518b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.returnFromMethod();
519b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
520b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
521b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_RETURN:
522b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.returnFromMethod();
523b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
524b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
525b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_NEWARRAY:
526b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                IntegerValue arrayLength = stack.ipop();
527b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(valueFactory.createArrayReferenceValue(String.valueOf(InstructionUtil.internalTypeFromArrayType((byte)simpleInstruction.constant)),
528b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                                  null,
529b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                                  arrayLength));
530b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
531b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
532b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ARRAYLENGTH:
533b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.apop();
534b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(valueFactory.createIntegerValue());
535b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
536b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
537b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ATHROW:
538b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                ReferenceValue exceptionReferenceValue = stack.apop();
539b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.clear();
540b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(exceptionReferenceValue);
541b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.throwException();
542b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
543b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
544b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_MONITORENTER:
545b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_MONITOREXIT:
546b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.apop();
547b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
548b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
549b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            default:
550b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                throw new IllegalArgumentException("Unknown simple instruction ["+simpleInstruction.opcode+"]");
551b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
552b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
553b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
554b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
555b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction)
556b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
557b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int constantIndex = constantInstruction.constantIndex;
558b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
559b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        switch (constantInstruction.opcode)
560b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
561b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LDC:
562b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LDC_W:
563b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LDC2_W:
564b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(cpValue(clazz, constantIndex, true));
565b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
566b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
567b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_GETSTATIC:
568b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_PUTSTATIC:
569b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_GETFIELD:
570b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_PUTFIELD:
571b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_INVOKEVIRTUAL:
572b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_INVOKESPECIAL:
573b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_INVOKESTATIC:
574b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_INVOKEINTERFACE:
575b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                invocationUnit.invokeMember(clazz, method, codeAttribute, offset, constantInstruction, stack);
576b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
577b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
578b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_NEW:
579b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(cpValue(clazz, constantIndex).referenceValue());
580b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
581b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
582b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ANEWARRAY:
583b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
584b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                ReferenceValue referenceValue = cpValue(clazz, constantIndex).referenceValue();
585b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
586b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(valueFactory.createArrayReferenceValue(referenceValue.internalType(),
587b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                                  referenceValue.getReferencedClass(),
588b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                                  stack.ipop()));
589b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
590b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
591b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
592b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_CHECKCAST:
593b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // TODO: Check cast.
594b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                ReferenceValue castValue = stack.apop();
595b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                ReferenceValue castResultValue =
596b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    castValue.isNull() == Value.ALWAYS ? castValue :
597b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    castValue.isNull() == Value.NEVER  ? cpValue(clazz, constantIndex).referenceValue() :
598b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                         cpValue(clazz, constantIndex).referenceValue().generalize(valueFactory.createReferenceValueNull());
599b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(castResultValue);
600b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
601b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
602b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_INSTANCEOF:
603b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
604b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                ReferenceValue referenceValue = cpValue(clazz, constantIndex).referenceValue();
605b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
606b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                int instanceOf = stack.apop().instanceOf(referenceValue.getType(),
607b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                         referenceValue.getReferencedClass());
608b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
609b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(instanceOf == Value.NEVER  ? valueFactory.createIntegerValue(0) :
610b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                           instanceOf == Value.ALWAYS ? valueFactory.createIntegerValue(1) :
611b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                        valueFactory.createIntegerValue());
612b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
613b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
614b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
615b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_MULTIANEWARRAY:
616b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
617b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                int dimensionCount = constantInstruction.constant;
618b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                for (int dimension = 0; dimension < dimensionCount; dimension++)
619b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
620b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    // TODO: Use array lengths.
621b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    IntegerValue arrayLength = stack.ipop();
622b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
623b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
624b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(cpValue(clazz, constantIndex).referenceValue());
625b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
626b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
627b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
628b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            default:
629b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                throw new IllegalArgumentException("Unknown constant pool instruction ["+constantInstruction.opcode+"]");
630b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
631b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
632b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
633b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
634b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitVariableInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VariableInstruction variableInstruction)
635b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
636b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int variableIndex = variableInstruction.variableIndex;
637b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
638b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        switch (variableInstruction.opcode)
639b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
640b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ILOAD:
641b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ILOAD_0:
642b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ILOAD_1:
643b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ILOAD_2:
644b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ILOAD_3:
645b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(variables.iload(variableIndex));
646b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
647b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
648b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LLOAD:
649b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LLOAD_0:
650b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LLOAD_1:
651b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LLOAD_2:
652b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LLOAD_3:
653b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(variables.lload(variableIndex));
654b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
655b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
656b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FLOAD:
657b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FLOAD_0:
658b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FLOAD_1:
659b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FLOAD_2:
660b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FLOAD_3:
661b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(variables.fload(variableIndex));
662b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
663b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
664b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DLOAD:
665b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DLOAD_0:
666b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DLOAD_1:
667b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DLOAD_2:
668b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DLOAD_3:
669b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(variables.dload(variableIndex));
670b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
671b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
672b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ALOAD:
673b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ALOAD_0:
674b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ALOAD_1:
675b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ALOAD_2:
676b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ALOAD_3:
677b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(variables.aload(variableIndex));
678b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
679b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
680b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ISTORE:
681b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ISTORE_0:
682b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ISTORE_1:
683b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ISTORE_2:
684b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ISTORE_3:
685b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                variables.store(variableIndex, stack.ipop());
686b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
687b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
688b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LSTORE:
689b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LSTORE_0:
690b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LSTORE_1:
691b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LSTORE_2:
692b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LSTORE_3:
693b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                variables.store(variableIndex, stack.lpop());
694b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
695b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
696b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FSTORE:
697b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FSTORE_0:
698b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FSTORE_1:
699b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FSTORE_2:
700b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FSTORE_3:
701b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                variables.store(variableIndex, stack.fpop());
702b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
703b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
704b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DSTORE:
705b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DSTORE_0:
706b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DSTORE_1:
707b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DSTORE_2:
708b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DSTORE_3:
709b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                variables.store(variableIndex, stack.dpop());
710b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
711b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
712b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ASTORE:
713b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ASTORE_0:
714b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ASTORE_1:
715b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ASTORE_2:
716b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ASTORE_3:
717b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // The operand on the stack can be a reference or a return
718b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // address, so we'll relax the pop operation.
719b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                //variables.store(variableIndex, stack.apop());
720b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                variables.store(variableIndex, stack.pop());
721b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
722b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
723b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IINC:
724b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                variables.store(variableIndex,
725b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                variables.iload(variableIndex).add(
726b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                valueFactory.createIntegerValue(variableInstruction.constant)));
727b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
728b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
729b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_RET:
730b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // The return address should be in the last offset of the
731b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // given instruction offset variable (even though there may
732b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // be other offsets).
733b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                InstructionOffsetValue instructionOffsetValue = variables.oload(variableIndex);
734b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branch(clazz,
735b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                  codeAttribute,
736b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                  offset,
737b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                  instructionOffsetValue.instructionOffset(instructionOffsetValue.instructionOffsetCount()-1));
738b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
739b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
740b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            default:
741b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                throw new IllegalArgumentException("Unknown variable instruction ["+variableInstruction.opcode+"]");
742b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
743b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
744b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
745b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
746b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction)
747b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
748b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int branchTarget = offset + branchInstruction.branchOffset;
749b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
750b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        switch (branchInstruction.opcode)
751b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
752b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFEQ:
753b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
754b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.ipop().equal(valueFactory.createIntegerValue(0)));
755b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
756b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
757b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFNE:
758b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
759b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.ipop().notEqual(valueFactory.createIntegerValue(0)));
760b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
761b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
762b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFLT:
763b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
764b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.ipop().lessThan(valueFactory.createIntegerValue(0)));
765b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
766b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
767b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFGE:
768b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
769b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.ipop().greaterThanOrEqual(valueFactory.createIntegerValue(0)));
770b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
771b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
772b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFGT:
773b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
774b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.ipop().greaterThan(valueFactory.createIntegerValue(0)));
775b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
776b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
777b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFLE:
778b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
779b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.ipop().lessThanOrEqual(valueFactory.createIntegerValue(0)));
780b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
781b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
782b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
783b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFICMPEQ:
784b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
785b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.ipop().equal(stack.ipop()));
786b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
787b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
788b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFICMPNE:
789b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
790b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.ipop().notEqual(stack.ipop()));
791b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
792b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
793b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFICMPLT:
794b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Note that the stack entries are popped in reverse order.
795b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
796b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.ipop().greaterThan(stack.ipop()));
797b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
798b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
799b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFICMPGE:
800b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Note that the stack entries are popped in reverse order.
801b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
802b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.ipop().lessThanOrEqual(stack.ipop()));
803b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
804b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
805b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFICMPGT:
806b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Note that the stack entries are popped in reverse order.
807b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
808b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.ipop().lessThan(stack.ipop()));
809b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
810b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
811b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFICMPLE:
812b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Note that the stack entries are popped in reverse order.
813b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
814b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.ipop().greaterThanOrEqual(stack.ipop()));
815b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
816b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
817b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFACMPEQ:
818b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
819b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.apop().equal(stack.apop()));
820b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
821b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
822b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFACMPNE:
823b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
824b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.apop().notEqual(stack.apop()));
825b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
826b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
827b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_GOTO:
828b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_GOTO_W:
829b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branch(clazz, codeAttribute, offset, branchTarget);
830b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
831b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
832b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
833b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_JSR:
834b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_JSR_W:
835b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(new InstructionOffsetValue(offset +
836b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                      branchInstruction.length(offset)));
837b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branch(clazz, codeAttribute, offset, branchTarget);
838b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
839b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
840b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFNULL:
841b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
842b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.apop().isNull());
843b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
844b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
845b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFNONNULL:
846b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
847b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.apop().isNotNull());
848b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
849b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
850b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            default:
851b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                throw new IllegalArgumentException("Unknown branch instruction ["+branchInstruction.opcode+"]");
852b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
853b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
854b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
855b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
856b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitTableSwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, TableSwitchInstruction tableSwitchInstruction)
857b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
858b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        IntegerValue indexValue = stack.ipop();
859b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
860b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // If there is no definite branch in any of the cases below,
861b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // branch to the default offset.
862b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        branchUnit.branch(clazz, codeAttribute,
863b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                          offset,
864b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                          offset + tableSwitchInstruction.defaultOffset);
865b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
866b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int index = 0; index < tableSwitchInstruction.jumpOffsets.length; index++)
867b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
868b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            int conditional = indexValue.equal(valueFactory.createIntegerValue(
869b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                tableSwitchInstruction.lowCase + index));
870b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            branchUnit.branchConditionally(clazz, codeAttribute,
871b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                           offset,
872b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                           offset + tableSwitchInstruction.jumpOffsets[index],
873b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                           conditional);
874b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
875b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // If this branch is always taken, we can skip the rest.
876b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (conditional == Value.ALWAYS)
877b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
878b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
879b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
880b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
881b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
882b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
883b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
884b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLookUpSwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, LookUpSwitchInstruction lookUpSwitchInstruction)
885b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
886b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        IntegerValue indexValue = stack.ipop();
887b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
888b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // If there is no definite branch in any of the cases below,
889b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // branch to the default offset.
890b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        branchUnit.branch(clazz, codeAttribute,
891b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                          offset,
892b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                          offset + lookUpSwitchInstruction.defaultOffset);
893b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
894b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int index = 0; index < lookUpSwitchInstruction.jumpOffsets.length; index++)
895b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
896b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            int conditional = indexValue.equal(valueFactory.createIntegerValue(
897b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                lookUpSwitchInstruction.cases[index]));
898b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            branchUnit.branchConditionally(clazz, codeAttribute,
899b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                           offset,
900b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                           offset + lookUpSwitchInstruction.jumpOffsets[index],
901b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                           conditional);
902b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
903b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // If this branch is always taken, we can skip the rest.
904b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (conditional == Value.ALWAYS)
905b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
906b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
907b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
908b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
909b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
910b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
911b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
912b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for ConstantVisitor.
913b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
914b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitIntegerConstant(Clazz clazz, IntegerConstant integerConstant)
915b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
916b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        cpValue = valueFactory.createIntegerValue(integerConstant.getValue());
917b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
918b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
919b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLongConstant(Clazz clazz, LongConstant longConstant)
920b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
921b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        cpValue = valueFactory.createLongValue(longConstant.getValue());
922b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
923b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
924b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitFloatConstant(Clazz clazz, FloatConstant floatConstant)
925b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
926b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        cpValue = valueFactory.createFloatValue(floatConstant.getValue());
927b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
928b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
929b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitDoubleConstant(Clazz clazz, DoubleConstant doubleConstant)
930b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
931b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        cpValue = valueFactory.createDoubleValue(doubleConstant.getValue());
932b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
933b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
934b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitStringConstant(Clazz clazz, StringConstant stringConstant)
935b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
936b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        cpValue = valueFactory.createReferenceValue(ClassConstants.INTERNAL_NAME_JAVA_LANG_STRING,
937b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                    stringConstant.javaLangStringClass,
938b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                    false);
939b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
940b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
941b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitClassConstant(Clazz clazz, ClassConstant classConstant)
942b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
943b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        cpValue = handleClassConstantAsClassValue ?
944b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            valueFactory.createReferenceValue(ClassConstants.INTERNAL_NAME_JAVA_LANG_CLASS,
945b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                              classConstant.javaLangClassClass,
946b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                              false) :
947b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            valueFactory.createReferenceValue(classConstant.getName(clazz),
948b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                              classConstant.referencedClass,
949b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                              false);
950b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
951b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
952b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
953b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Small utility methods.
954b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
955b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
956b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the Value of the constant pool element at the given index.
957b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
958b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private Value cpValue(Clazz clazz,
959b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                          int   constantIndex)
960b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
961b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return cpValue(clazz, constantIndex, false);
962b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
963b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
964b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
965b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
966b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the Value of the constant pool element at the given index.
967b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
968b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private Value cpValue(Clazz   clazz,
969b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                          int     constantIndex,
970b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                          boolean handleClassConstantAsClassValue)
971b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
972b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        this.handleClassConstantAsClassValue = handleClassConstantAsClassValue;
973b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
974b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Visit the constant pool entry to get its return value.
975b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        clazz.constantPoolEntryAccept(constantIndex, this);
976b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
977b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return cpValue;
978b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
979b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
980