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