1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/*
2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification
3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *             of Java bytecode.
4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
52270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * Copyright (c) 2002-2014 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.instruction.*;
26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.instruction.visitor.InstructionVisitor;
27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.evaluation.value.*;
28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/**
30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This InstructionVisitor executes the instructions that it visits on a given
31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * local variable frame and stack.
32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune
34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */
35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopublic class Processor
36b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangimplements   InstructionVisitor
37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{
38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private final Variables      variables;
39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private final Stack          stack;
40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private final ValueFactory   valueFactory;
41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private final BranchUnit     branchUnit;
42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private final InvocationUnit invocationUnit;
432270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    private final boolean        alwaysCast;
44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
45b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    private final ConstantValueFactory      constantValueFactory;
46b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    private final ClassConstantValueFactory classConstantValueFactory;
47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Creates a new processor that operates on the given environment.
51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param variables      the local variable frame.
52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param stack          the local stack.
53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param branchUnit     the class that can affect the program counter.
54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param invocationUnit the class that can access other program members.
552270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     * @param alwaysCast     a flag that specifies whether downcasts or casts
562270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     *                       of null values should always be performed.
57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public Processor(Variables      variables,
59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                     Stack          stack,
60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                     ValueFactory   valueFactory,
61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                     BranchUnit     branchUnit,
622270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                     InvocationUnit invocationUnit,
632270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                     boolean        alwaysCast)
64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        this.variables      = variables;
66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        this.stack          = stack;
67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        this.valueFactory   = valueFactory;
68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        this.branchUnit     = branchUnit;
69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        this.invocationUnit = invocationUnit;
702270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        this.alwaysCast    = alwaysCast;
71b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
72b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        constantValueFactory      = new ConstantValueFactory(valueFactory);
73b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        classConstantValueFactory = new ClassConstantValueFactory(valueFactory);
74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for InstructionVisitor.
78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitSimpleInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SimpleInstruction simpleInstruction)
80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        switch (simpleInstruction.opcode)
82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_NOP:
84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ACONST_NULL:
87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(valueFactory.createReferenceValueNull());
88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_M1:
91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_0:
92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_1:
93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_2:
94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_3:
95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_4:
96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_5:
97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_BIPUSH:
98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_SIPUSH:
99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(valueFactory.createIntegerValue(simpleInstruction.constant));
100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LCONST_0:
103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LCONST_1:
104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(valueFactory.createLongValue(simpleInstruction.constant));
105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FCONST_0:
108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FCONST_1:
109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FCONST_2:
110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(valueFactory.createFloatValue((float)simpleInstruction.constant));
111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DCONST_0:
114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DCONST_1:
115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(valueFactory.createDoubleValue((double)simpleInstruction.constant));
116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IALOAD:
119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_BALOAD:
120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_CALOAD:
121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_SALOAD:
1222270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            {
1232270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                IntegerValue   arrayIndex     = stack.ipop();
1242270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                ReferenceValue arrayReference = stack.apop();
1252270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                stack.push(arrayReference.integerArrayLoad(arrayIndex, valueFactory));
126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
1272270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            }
128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LALOAD:
1292270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            {
1302270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                IntegerValue   arrayIndex     = stack.ipop();
1312270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                ReferenceValue arrayReference = stack.apop();
1322270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                stack.push(arrayReference.longArrayLoad(arrayIndex, valueFactory));
133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
1342270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            }
135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FALOAD:
1362270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            {
1372270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                IntegerValue   arrayIndex     = stack.ipop();
1382270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                ReferenceValue arrayReference = stack.apop();
1392270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                stack.push(arrayReference.floatArrayLoad(arrayIndex, valueFactory));
140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
1412270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            }
142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DALOAD:
1432270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            {
1442270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                IntegerValue   arrayIndex     = stack.ipop();
1452270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                ReferenceValue arrayReference = stack.apop();
1462270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                stack.push(arrayReference.doubleArrayLoad(arrayIndex, valueFactory));
147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
1482270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            }
149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_AALOAD:
150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                IntegerValue   arrayIndex     = stack.ipop();
152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                ReferenceValue arrayReference = stack.apop();
1532270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                stack.push(arrayReference.referenceArrayLoad(arrayIndex, valueFactory));
154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IASTORE:
157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_BASTORE:
158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_CASTORE:
159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_SASTORE:
1602270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            {
1612270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                Value          value          = stack.ipop();
1622270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                IntegerValue   arrayIndex     = stack.ipop();
1632270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                ReferenceValue arrayReference = stack.apop();
1642270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                arrayReference.arrayStore(arrayIndex, value);
165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
1662270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            }
167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LASTORE:
1682270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            {
1692270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                Value          value          = stack.lpop();
1702270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                IntegerValue   arrayIndex     = stack.ipop();
1712270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                ReferenceValue arrayReference = stack.apop();
1722270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                arrayReference.arrayStore(arrayIndex, value);
173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
1742270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            }
175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FASTORE:
1762270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            {
1772270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                Value          value          = stack.fpop();
1782270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                IntegerValue   arrayIndex     = stack.ipop();
1792270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                ReferenceValue arrayReference = stack.apop();
1802270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                arrayReference.arrayStore(arrayIndex, value);
181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
1822270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            }
183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DASTORE:
1842270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            {
1852270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                Value          value          = stack.dpop();
1862270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                IntegerValue   arrayIndex     = stack.ipop();
1872270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                ReferenceValue arrayReference = stack.apop();
1882270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                arrayReference.arrayStore(arrayIndex, value);
189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
1902270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            }
191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_AASTORE:
1922270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            {
1932270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                Value          value          = stack.apop();
1942270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                IntegerValue   arrayIndex     = stack.ipop();
1952270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                ReferenceValue arrayReference = stack.apop();
1962270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                arrayReference.arrayStore(arrayIndex, value);
197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
1982270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            }
199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_POP:
200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.pop1();
201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_POP2:
204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.pop2();
205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DUP:
208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.dup();
209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DUP_X1:
212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.dup_x1();
213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DUP_X2:
216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.dup_x2();
217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DUP2:
220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.dup2();
221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DUP2_X1:
224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.dup2_x1();
225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DUP2_X2:
228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.dup2_x2();
229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_SWAP:
232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.swap();
233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IADD:
236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().add(stack.ipop()));
237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LADD:
240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.lpop().add(stack.lpop()));
241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FADD:
244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.fpop().add(stack.fpop()));
245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DADD:
248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.dpop().add(stack.dpop()));
249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ISUB:
252b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().subtractFrom(stack.ipop()));
253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
255b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LSUB:
256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.lpop().subtractFrom(stack.lpop()));
257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
259b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FSUB:
260b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.fpop().subtractFrom(stack.fpop()));
261b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DSUB:
264b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.dpop().subtractFrom(stack.dpop()));
265b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
266b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
267b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IMUL:
268b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().multiply(stack.ipop()));
269b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
270b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
271b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LMUL:
272b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.lpop().multiply(stack.lpop()));
273b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
274b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
275b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FMUL:
276b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.fpop().multiply(stack.fpop()));
277b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
278b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
279b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DMUL:
280b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.dpop().multiply(stack.dpop()));
281b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
282b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
283b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IDIV:
284b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                try
285b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
286b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.push(stack.ipop().divideOf(stack.ipop()));
287b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
288b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                catch (ArithmeticException ex)
289b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
290b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.push(valueFactory.createIntegerValue());
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_LDIV:
299b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                try
300b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
301b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.push(stack.lpop().divideOf(stack.lpop()));
302b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
303b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                catch (ArithmeticException ex)
304b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
305b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.push(valueFactory.createLongValue());
306b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    // TODO: Forward ArithmeticExceptions.
307b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    //stack.clear();
308b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    //stack.push(valueFactory.createReference(false));
309b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    //branchUnit.throwException();
310b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
311b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
312b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
313b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FDIV:
314b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.fpop().divideOf(stack.fpop()));
315b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
316b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
317b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DDIV:
318b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.dpop().divideOf(stack.dpop()));
319b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
320b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
321b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IREM:
322b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                try
323b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
324b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.push(stack.ipop().remainderOf(stack.ipop()));
325b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
326b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                catch (ArithmeticException ex)
327b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
328b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.push(valueFactory.createIntegerValue());
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_LREM:
337b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                try
338b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
339b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.push(stack.lpop().remainderOf(stack.lpop()));
340b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
341b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                catch (ArithmeticException ex)
342b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
343b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.push(valueFactory.createLongValue());
344b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    // TODO: Forward ArithmeticExceptions.
345b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    //stack.clear();
346b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    //stack.push(valueFactory.createReference(false));
347b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    //branchUnit.throwException();
348b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
349b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
350b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
351b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FREM:
352b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.fpop().remainderOf(stack.fpop()));
353b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
354b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
355b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DREM:
356b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.dpop().remainderOf(stack.dpop()));
357b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
358b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
359b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_INEG:
360b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().negate());
361b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
362b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
363b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LNEG:
364b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.lpop().negate());
365b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
366b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
367b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FNEG:
368b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.fpop().negate());
369b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
370b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
371b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DNEG:
372b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.dpop().negate());
373b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
374b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
375b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ISHL:
376b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().shiftLeftOf(stack.ipop()));
377b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
378b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
379b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LSHL:
380b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().shiftLeftOf(stack.lpop()));
381b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
382b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
383b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ISHR:
384b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().shiftRightOf(stack.ipop()));
385b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
386b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
387b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LSHR:
388b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().shiftRightOf(stack.lpop()));
389b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
390b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
391b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IUSHR:
392b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().unsignedShiftRightOf(stack.ipop()));
393b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
394b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
395b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LUSHR:
396b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().unsignedShiftRightOf(stack.lpop()));
397b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
398b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
399b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IAND:
400b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().and(stack.ipop()));
401b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
402b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
403b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LAND:
404b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.lpop().and(stack.lpop()));
405b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
406b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
407b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IOR:
408b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().or(stack.ipop()));
409b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
410b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
411b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LOR:
412b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.lpop().or(stack.lpop()));
413b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
414b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
415b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IXOR:
416b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().xor(stack.ipop()));
417b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
418b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
419b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LXOR:
420b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.lpop().xor(stack.lpop()));
421b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
422b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
423b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_I2L:
424b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().convertToLong());
425b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
426b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
427b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_I2F:
428b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().convertToFloat());
429b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
430b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
431b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_I2D:
432b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().convertToDouble());
433b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
434b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
435b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_L2I:
436b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.lpop().convertToInteger());
437b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
438b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
439b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_L2F:
440b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.lpop().convertToFloat());
441b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
442b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
443b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_L2D:
444b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.lpop().convertToDouble());
445b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
446b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
447b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_F2I:
448b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.fpop().convertToInteger());
449b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
450b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
451b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_F2L:
452b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.fpop().convertToLong());
453b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
454b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
455b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_F2D:
456b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.fpop().convertToDouble());
457b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
458b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
459b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_D2I:
460b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.dpop().convertToInteger());
461b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
462b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
463b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_D2L:
464b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.dpop().convertToLong());
465b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
466b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
467b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_D2F:
468b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.dpop().convertToFloat());
469b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
470b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
471b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_I2B:
472b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().convertToByte());
473b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
474b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
475b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_I2C:
476b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().convertToCharacter());
477b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
478b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
479b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_I2S:
480b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.ipop().convertToShort());
481b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
482b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
483b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LCMP:
484b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//                stack.push(stack.lpop().compareReverse(stack.lpop()));
485b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
486b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                LongValue longValue1 = stack.lpop();
487b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                LongValue longValue2 = stack.lpop();
488b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(longValue2.compare(longValue1));
489b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
490b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
491b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FCMPL:
492b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                FloatValue floatValue1 = stack.fpop();
493b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                FloatValue floatValue2 = stack.fpop();
494b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(floatValue2.compare(floatValue1));
495b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
496b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
497b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FCMPG:
498b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.fpop().compareReverse(stack.fpop()));
499b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
500b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
501b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DCMPL:
502b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                DoubleValue doubleValue1 = stack.dpop();
503b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                DoubleValue doubleValue2 = stack.dpop();
504b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(doubleValue2.compare(doubleValue1));
505b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
506b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
507b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DCMPG:
508b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(stack.dpop().compareReverse(stack.dpop()));
509b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
510b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
511b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IRETURN:
512b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                invocationUnit.exitMethod(clazz, method, stack.ipop());
513b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.returnFromMethod();
514b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
515b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
516b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LRETURN:
517b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                invocationUnit.exitMethod(clazz, method, stack.lpop());
518b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.returnFromMethod();
519b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
520b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
521b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FRETURN:
522b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                invocationUnit.exitMethod(clazz, method, stack.fpop());
523b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.returnFromMethod();
524b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
525b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
526b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DRETURN:
527b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                invocationUnit.exitMethod(clazz, method, stack.dpop());
528b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.returnFromMethod();
529b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
530b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
531b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ARETURN:
532b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                invocationUnit.exitMethod(clazz, method, stack.apop());
533b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.returnFromMethod();
534b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
535b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
536b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_RETURN:
537b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.returnFromMethod();
538b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
539b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
540b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_NEWARRAY:
541b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                IntegerValue arrayLength = stack.ipop();
542b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(valueFactory.createArrayReferenceValue(String.valueOf(InstructionUtil.internalTypeFromArrayType((byte)simpleInstruction.constant)),
543b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                                  null,
544b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                                  arrayLength));
545b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
546b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
547b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ARRAYLENGTH:
5482270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                ReferenceValue referenceValue = stack.apop();
5492270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                stack.push(referenceValue.arrayLength(valueFactory));
550b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
551b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
552b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ATHROW:
553b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                ReferenceValue exceptionReferenceValue = stack.apop();
554b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.clear();
555b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(exceptionReferenceValue);
556b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.throwException();
557b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
558b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
559b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_MONITORENTER:
560b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_MONITOREXIT:
561b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.apop();
562b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
563b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
564b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            default:
565b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                throw new IllegalArgumentException("Unknown simple instruction ["+simpleInstruction.opcode+"]");
566b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
567b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
568b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
569b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
570b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction)
571b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
572b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int constantIndex = constantInstruction.constantIndex;
573b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
574b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        switch (constantInstruction.opcode)
575b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
576b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LDC:
577b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LDC_W:
578b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LDC2_W:
579b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                stack.push(classConstantValueFactory.constantValue(clazz, constantIndex));
580b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
581b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
582b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_GETSTATIC:
583b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_PUTSTATIC:
584b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_GETFIELD:
585b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_PUTFIELD:
586b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_INVOKEVIRTUAL:
587b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_INVOKESPECIAL:
588b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_INVOKESTATIC:
589b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_INVOKEINTERFACE:
590b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            case InstructionConstants.OP_INVOKEDYNAMIC:
591b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                invocationUnit.invokeMember(clazz, method, codeAttribute, offset, constantInstruction, stack);
592b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
593b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
594b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_NEW:
595b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                stack.push(constantValueFactory.constantValue(clazz, constantIndex).referenceValue());
596b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
597b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
598b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ANEWARRAY:
599b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
600b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                ReferenceValue referenceValue = constantValueFactory.constantValue(clazz, constantIndex).referenceValue();
601b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
602b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(valueFactory.createArrayReferenceValue(referenceValue.internalType(),
603b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                                  referenceValue.getReferencedClass(),
604b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                                  stack.ipop()));
605b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
606b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
607b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
608b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_CHECKCAST:
609b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // TODO: Check cast.
610b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                ReferenceValue castValue = stack.apop();
611b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                ReferenceValue castResultValue =
6122270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                    !alwaysCast &&
613b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    castValue.isNull() == Value.ALWAYS ? castValue :
614b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                    castValue.isNull() == Value.NEVER  ? constantValueFactory.constantValue(clazz, constantIndex).referenceValue() :
615b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                                                         constantValueFactory.constantValue(clazz, constantIndex).referenceValue().generalize(valueFactory.createReferenceValueNull());
616b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(castResultValue);
617b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
618b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
619b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_INSTANCEOF:
620b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
621b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                ReferenceValue referenceValue = constantValueFactory.constantValue(clazz, constantIndex).referenceValue();
622b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
623b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                int instanceOf = stack.apop().instanceOf(referenceValue.getType(),
624b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                         referenceValue.getReferencedClass());
625b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
626b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(instanceOf == Value.NEVER  ? valueFactory.createIntegerValue(0) :
627b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                           instanceOf == Value.ALWAYS ? valueFactory.createIntegerValue(1) :
628b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                        valueFactory.createIntegerValue());
629b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
630b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
631b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
632b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_MULTIANEWARRAY:
633b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
634b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                int dimensionCount = constantInstruction.constant;
635b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                for (int dimension = 0; dimension < dimensionCount; dimension++)
636b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
637b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    // TODO: Use array lengths.
638b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    IntegerValue arrayLength = stack.ipop();
639b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
640b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
641b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                stack.push(constantValueFactory.constantValue(clazz, constantIndex).referenceValue());
642b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
643b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
644b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
645b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            default:
646b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                throw new IllegalArgumentException("Unknown constant pool instruction ["+constantInstruction.opcode+"]");
647b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
648b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
649b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
650b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
651b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitVariableInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VariableInstruction variableInstruction)
652b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
653b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int variableIndex = variableInstruction.variableIndex;
654b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
655b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        switch (variableInstruction.opcode)
656b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
657b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ILOAD:
658b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ILOAD_0:
659b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ILOAD_1:
660b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ILOAD_2:
661b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ILOAD_3:
662b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(variables.iload(variableIndex));
663b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
664b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
665b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LLOAD:
666b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LLOAD_0:
667b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LLOAD_1:
668b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LLOAD_2:
669b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LLOAD_3:
670b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(variables.lload(variableIndex));
671b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
672b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
673b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FLOAD:
674b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FLOAD_0:
675b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FLOAD_1:
676b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FLOAD_2:
677b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FLOAD_3:
678b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(variables.fload(variableIndex));
679b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
680b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
681b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DLOAD:
682b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DLOAD_0:
683b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DLOAD_1:
684b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DLOAD_2:
685b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DLOAD_3:
686b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(variables.dload(variableIndex));
687b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
688b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
689b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ALOAD:
690b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ALOAD_0:
691b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ALOAD_1:
692b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ALOAD_2:
693b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ALOAD_3:
694b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(variables.aload(variableIndex));
695b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
696b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
697b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ISTORE:
698b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ISTORE_0:
699b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ISTORE_1:
700b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ISTORE_2:
701b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ISTORE_3:
702b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                variables.store(variableIndex, stack.ipop());
703b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
704b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
705b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LSTORE:
706b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LSTORE_0:
707b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LSTORE_1:
708b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LSTORE_2:
709b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LSTORE_3:
710b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                variables.store(variableIndex, stack.lpop());
711b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
712b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
713b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FSTORE:
714b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FSTORE_0:
715b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FSTORE_1:
716b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FSTORE_2:
717b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FSTORE_3:
718b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                variables.store(variableIndex, stack.fpop());
719b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
720b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
721b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DSTORE:
722b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DSTORE_0:
723b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DSTORE_1:
724b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DSTORE_2:
725b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DSTORE_3:
726b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                variables.store(variableIndex, stack.dpop());
727b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
728b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
729b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ASTORE:
730b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ASTORE_0:
731b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ASTORE_1:
732b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ASTORE_2:
733b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ASTORE_3:
734b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // The operand on the stack can be a reference or a return
735b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // address, so we'll relax the pop operation.
736b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                //variables.store(variableIndex, stack.apop());
737b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                variables.store(variableIndex, stack.pop());
738b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
739b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
740b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IINC:
741b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                variables.store(variableIndex,
742b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                variables.iload(variableIndex).add(
743b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                valueFactory.createIntegerValue(variableInstruction.constant)));
744b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
745b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
746b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_RET:
747b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // The return address should be in the last offset of the
748b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // given instruction offset variable (even though there may
749b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // be other offsets).
750b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                InstructionOffsetValue instructionOffsetValue = variables.oload(variableIndex);
751b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branch(clazz,
752b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                  codeAttribute,
753b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                  offset,
754b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                  instructionOffsetValue.instructionOffset(instructionOffsetValue.instructionOffsetCount()-1));
755b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
756b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
757b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            default:
758b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                throw new IllegalArgumentException("Unknown variable instruction ["+variableInstruction.opcode+"]");
759b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
760b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
761b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
762b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
763b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitBranchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, BranchInstruction branchInstruction)
764b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
765b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int branchTarget = offset + branchInstruction.branchOffset;
766b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
767b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        switch (branchInstruction.opcode)
768b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
769b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFEQ:
770b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
771b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.ipop().equal(valueFactory.createIntegerValue(0)));
772b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
773b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
774b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFNE:
775b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
776b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.ipop().notEqual(valueFactory.createIntegerValue(0)));
777b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
778b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
779b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFLT:
780b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
781b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.ipop().lessThan(valueFactory.createIntegerValue(0)));
782b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
783b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
784b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFGE:
785b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
786b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.ipop().greaterThanOrEqual(valueFactory.createIntegerValue(0)));
787b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
788b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
789b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFGT:
790b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
791b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.ipop().greaterThan(valueFactory.createIntegerValue(0)));
792b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
793b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
794b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFLE:
795b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
796b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.ipop().lessThanOrEqual(valueFactory.createIntegerValue(0)));
797b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
798b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
799b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
800b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFICMPEQ:
801b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
802b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.ipop().equal(stack.ipop()));
803b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
804b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
805b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFICMPNE:
806b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
807b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.ipop().notEqual(stack.ipop()));
808b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
809b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
810b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFICMPLT:
811b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Note that the stack entries are popped in reverse order.
812b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
813b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.ipop().greaterThan(stack.ipop()));
814b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
815b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
816b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFICMPGE:
817b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Note that the stack entries are popped in reverse order.
818b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
819b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.ipop().lessThanOrEqual(stack.ipop()));
820b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
821b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
822b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFICMPGT:
823b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Note that the stack entries are popped in reverse order.
824b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
825b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.ipop().lessThan(stack.ipop()));
826b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
827b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
828b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFICMPLE:
829b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Note that the stack entries are popped in reverse order.
830b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
831b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.ipop().greaterThanOrEqual(stack.ipop()));
832b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
833b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
834b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFACMPEQ:
835b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
836b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.apop().equal(stack.apop()));
837b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
838b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
839b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFACMPNE:
840b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
841b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.apop().notEqual(stack.apop()));
842b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
843b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
844b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_GOTO:
845b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_GOTO_W:
846b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branch(clazz, codeAttribute, offset, branchTarget);
847b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
848b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
849b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
850b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_JSR:
851b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_JSR_W:
852b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                stack.push(new InstructionOffsetValue(offset +
853b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                      branchInstruction.length(offset)));
854b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branch(clazz, codeAttribute, offset, branchTarget);
855b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
856b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
857b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFNULL:
858b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
859b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.apop().isNull());
860b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
861b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
862b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_IFNONNULL:
863b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                branchUnit.branchConditionally(clazz, codeAttribute, offset, branchTarget,
864b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    stack.apop().isNotNull());
865b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
866b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
867b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            default:
868b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                throw new IllegalArgumentException("Unknown branch instruction ["+branchInstruction.opcode+"]");
869b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
870b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
871b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
872b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
873b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitTableSwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, TableSwitchInstruction tableSwitchInstruction)
874b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
875b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        IntegerValue indexValue = stack.ipop();
876b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
877b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // If there is no definite branch in any of the cases below,
878b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // branch to the default offset.
879b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        branchUnit.branch(clazz, codeAttribute,
880b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                          offset,
881b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                          offset + tableSwitchInstruction.defaultOffset);
882b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
883b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int index = 0; index < tableSwitchInstruction.jumpOffsets.length; index++)
884b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
885b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            int conditional = indexValue.equal(valueFactory.createIntegerValue(
886b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                tableSwitchInstruction.lowCase + index));
887b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            branchUnit.branchConditionally(clazz, codeAttribute,
888b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                           offset,
889b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                           offset + tableSwitchInstruction.jumpOffsets[index],
890b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                           conditional);
891b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
892b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // If this branch is always taken, we can skip the rest.
893b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (conditional == Value.ALWAYS)
894b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
895b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
896b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
897b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
898b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
899b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
900b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
901b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLookUpSwitchInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, LookUpSwitchInstruction lookUpSwitchInstruction)
902b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
903b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        IntegerValue indexValue = stack.ipop();
904b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
905b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // If there is no definite branch in any of the cases below,
906b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // branch to the default offset.
907b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        branchUnit.branch(clazz, codeAttribute,
908b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                          offset,
909b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                          offset + lookUpSwitchInstruction.defaultOffset);
910b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
911b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int index = 0; index < lookUpSwitchInstruction.jumpOffsets.length; index++)
912b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
913b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            int conditional = indexValue.equal(valueFactory.createIntegerValue(
914b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                lookUpSwitchInstruction.cases[index]));
915b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            branchUnit.branchConditionally(clazz, codeAttribute,
916b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                           offset,
917b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                           offset + lookUpSwitchInstruction.jumpOffsets[index],
918b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                           conditional);
919b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
920b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // If this branch is always taken, we can skip the rest.
921b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (conditional == Value.ALWAYS)
922b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
923b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
924b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
925b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
926b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
927b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
928