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