Instruction.java revision b9cc48a43ed984587c939d02fba5316bf5c0df6e
1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/* 2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification 3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * of Java bytecode. 4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 5b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Copyright (c) 2002-2013 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.classfile.instruction; 22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 23b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.*; 24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.CodeAttribute; 25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.instruction.visitor.InstructionVisitor; 26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/** 28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Base class for representing instructions. 29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune 31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopublic abstract class Instruction 33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{ 34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // An array for marking Category 2 instructions. 35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static final boolean[] IS_CATEGORY2 = new boolean[] 36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // nop 38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // aconst_null 39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iconst_m1 40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iconst_0 41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iconst_1 42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iconst_2 43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iconst_3 44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iconst_4 45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iconst_5 46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lconst_0 47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lconst_1 48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fconst_0 49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fconst_1 50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fconst_2 51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dconst_0 52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dconst_1 53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // bipush 54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // sipush 55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ldc 56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ldc_w 57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // ldc2_w 58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iload 59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lload 60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fload 61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dload 62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // aload 63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iload_0 64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iload_1 65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iload_2 66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iload_3 67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lload_0 68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lload_1 69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lload_2 70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lload_3 71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fload_0 72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fload_1 73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fload_2 74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fload_3 75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dload_0 76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dload_1 77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dload_2 78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dload_3 79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // aload_0 80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // aload_1 81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // aload_2 82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // aload_3 83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iaload 84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // laload 85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // faload 86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // daload 87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // aaload 88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // baload 89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // caload 90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // saload 91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // istore 92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lstore 93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fstore 94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dstore 95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // astore 96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // istore_0 97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // istore_1 98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // istore_2 99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // istore_3 100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lstore_0 101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lstore_1 102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lstore_2 103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lstore_3 104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fstore_0 105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fstore_1 106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fstore_2 107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fstore_3 108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dstore_0 109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dstore_1 110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dstore_2 111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dstore_3 112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // astore_0 113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // astore_1 114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // astore_2 115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // astore_3 116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iastore 117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lastore 118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fastore 119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dastore 120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // aastore 121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // bastore 122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // castore 123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // sastore 124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // pop 125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // pop2 126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // dup 127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // dup_x1 128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // dup_x2 129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dup2 130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dup2_x1 131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dup2_x2 132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // swap 133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iadd 134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // ladd 135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fadd 136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dadd 137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // isub 138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lsub 139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fsub 140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dsub 141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // imul 142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lmul 143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fmul 144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dmul 145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // idiv 146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // ldiv 147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fdiv 148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // ddiv 149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // irem 150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lrem 151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // frem 152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // drem 153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ineg 154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lneg 155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fneg 156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dneg 157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ishl 158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lshl 159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ishr 160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lshr 161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iushr 162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lushr 163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iand 164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // land 165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ior 166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lor 167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ixor 168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lxor 169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iinc 170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // i2l 171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // i2f 172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // i2d 173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // l2i 174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // l2f 175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // l2d 176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // f2i 177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // f2l 178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // f2d 179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // d2i 180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // d2l 181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // d2f 182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // i2b 183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // i2c 184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // i2s 185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lcmp 186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fcmpl 187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fcmpg 188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dcmpl 189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dcmpg 190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ifeq 191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ifne 192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iflt 193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ifge 194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ifgt 195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ifle 196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ificmpeq 197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ificmpne 198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ificmplt 199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ificmpge 200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ificmpgt 201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ificmple 202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ifacmpeq 203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ifacmpne 204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // goto 205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // jsr 206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ret 207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // tableswitch 208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // lookupswitch 209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ireturn 210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lreturn 211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // freturn 212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dreturn 213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // areturn 214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // return 215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // getstatic 216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // putstatic 217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // getfield 218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // putfield 219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // invokevirtual 220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // invokespecial 221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // invokestatic 222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // invokeinterface 223b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang false, // invokedynamic 224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // new 225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // newarray 226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // anewarray 227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // arraylength 228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // athrow 229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // checkcast 230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // instanceof 231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // monitorenter 232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // monitorexit 233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // wide 234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // multianewarray 235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ifnull 236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ifnonnull 237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // goto_w 238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // jsr_w 239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato }; 240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // An array containing the fixed number of entries popped from the stack, 243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // for all instructions. 244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static final int[] STACK_POP_COUNTS = new int[] 245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // nop 247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // aconst_null 248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iconst_m1 249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iconst_0 250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iconst_1 251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iconst_2 252b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iconst_3 253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iconst_4 254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iconst_5 255b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lconst_0 256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lconst_1 257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // fconst_0 258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // fconst_1 259b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // fconst_2 260b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // dconst_0 261b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // dconst_1 262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // bipush 263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // sipush 264b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ldc 265b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ldc_w 266b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ldc2_w 267b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iload 268b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lload 269b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // fload 270b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // dload 271b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // aload 272b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iload_0 273b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iload_1 274b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iload_2 275b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iload_3 276b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lload_0 277b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lload_1 278b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lload_2 279b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lload_3 280b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // fload_0 281b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // fload_1 282b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // fload_2 283b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // fload_3 284b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // dload_0 285b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // dload_1 286b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // dload_2 287b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // dload_3 288b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // aload_0 289b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // aload_1 290b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // aload_2 291b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // aload_3 292b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // iaload 293b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // laload 294b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // faload 295b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // daload 296b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // aaload 297b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // baload 298b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // caload 299b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // saload 300b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // istore 301b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lstore 302b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fstore 303b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dstore 304b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // astore 305b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // istore_0 306b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // istore_1 307b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // istore_2 308b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // istore_3 309b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lstore_0 310b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lstore_1 311b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lstore_2 312b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lstore_3 313b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fstore_0 314b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fstore_1 315b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fstore_2 316b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fstore_3 317b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dstore_0 318b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dstore_1 319b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dstore_2 320b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dstore_3 321b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // astore_0 322b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // astore_1 323b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // astore_2 324b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // astore_3 325b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 3, // iastore 326b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // lastore 327b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 3, // fastore 328b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // dastore 329b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 3, // aastore 330b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 3, // bastore 331b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 3, // castore 332b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 3, // sastore 333b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // pop 334b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // pop2 335b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // dup 336b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dup_x1 337b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 3, // dup_x2 338b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dup2 339b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 3, // dup2_x1 340b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // dup2_x2 341b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // swap 342b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // iadd 343b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // ladd 344b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // fadd 345b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // dadd 346b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // isub 347b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // lsub 348b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // fsub 349b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // dsub 350b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // imul 351b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // lmul 352b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // fmul 353b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // dmul 354b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // idiv 355b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // ldiv 356b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // fdiv 357b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // ddiv 358b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // irem 359b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // lrem 360b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // frem 361b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // drem 362b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ineg 363b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lneg 364b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fneg 365b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dneg 366b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ishl 367b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 3, // lshl 368b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ishr 369b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 3, // lshr 370b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // iushr 371b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 3, // lushr 372b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // iand 373b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // land 374b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ior 375b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // lor 376b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ixor 377b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // lxor 378b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iinc 379b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // i2l 380b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // i2f 381b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // i2d 382b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // l2i 383b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // l2f 384b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // l2d 385b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // f2i 386b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // f2l 387b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // f2d 388b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // d2i 389b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // d2l 390b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // d2f 391b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // i2b 392b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // i2c 393b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // i2s 394b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // lcmp 395b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // fcmpl 396b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // fcmpg 397b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // dcmpl 398b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // dcmpg 399b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ifeq 400b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ifne 401b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iflt 402b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ifge 403b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ifgt 404b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ifle 405b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ificmpeq 406b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ificmpne 407b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ificmplt 408b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ificmpge 409b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ificmpgt 410b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ificmple 411b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ifacmpeq 412b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ifacmpne 413b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // goto 414b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // jsr 415b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ret 416b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // tableswitch 417b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // lookupswitch 418b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ireturn 419b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lreturn 420b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // freturn 421b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dreturn 422b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // areturn 423b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // return 424b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // getstatic 425b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // putstatic 426b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // getfield 427b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // putfield 428b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // invokevirtual 429b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // invokespecial 430b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // invokestatic 431b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // invokeinterface 432b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 0, // invokedynamic 433b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // new 434b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // newarray 435b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // anewarray 436b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // arraylength 437b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // athrow 438b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // checkcast 439b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // instanceof 440b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // monitorenter 441b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // monitorexit 442b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // wide 443b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // multianewarray 444b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ifnull 445b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ifnonnull 446b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // goto_w 447b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // jsr_w 448b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato }; 449b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 450b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 451b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // An array containing the fixed number of entries pushed onto the stack, 452b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // for all instructions. 453b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static final int[] STACK_PUSH_COUNTS = new int[] 454b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 455b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // nop 456b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // aconst_null 457b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iconst_m1 458b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iconst_0 459b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iconst_1 460b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iconst_2 461b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iconst_3 462b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iconst_4 463b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iconst_5 464b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lconst_0 465b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lconst_1 466b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fconst_0 467b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fconst_1 468b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fconst_2 469b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dconst_0 470b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dconst_1 471b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // bipush 472b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // sipush 473b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ldc 474b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ldc_w 475b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ldc2_w 476b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iload 477b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lload 478b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fload 479b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dload 480b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // aload 481b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iload_0 482b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iload_1 483b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iload_2 484b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iload_3 485b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lload_0 486b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lload_1 487b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lload_2 488b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lload_3 489b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fload_0 490b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fload_1 491b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fload_2 492b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fload_3 493b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dload_0 494b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dload_1 495b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dload_2 496b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dload_3 497b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // aload_0 498b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // aload_1 499b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // aload_2 500b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // aload_3 501b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iaload 502b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // laload 503b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // faload 504b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // daload 505b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // aaload 506b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // baload 507b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // caload 508b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // saload 509b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // istore 510b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lstore 511b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // fstore 512b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // dstore 513b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // astore 514b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // istore_0 515b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // istore_1 516b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // istore_2 517b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // istore_3 518b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lstore_0 519b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lstore_1 520b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lstore_2 521b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lstore_3 522b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // fstore_0 523b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // fstore_1 524b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // fstore_2 525b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // fstore_3 526b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // dstore_0 527b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // dstore_1 528b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // dstore_2 529b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // dstore_3 530b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // astore_0 531b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // astore_1 532b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // astore_2 533b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // astore_3 534b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iastore 535b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lastore 536b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // fastore 537b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // dastore 538b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // aastore 539b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // bastore 540b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // castore 541b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // sastore 542b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // pop 543b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // pop2 544b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dup 545b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 3, // dup_x1 546b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // dup_x2 547b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // dup2 548b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 5, // dup2_x1 549b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 6, // dup2_x2 550b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // swap 551b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iadd 552b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ladd 553b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fadd 554b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dadd 555b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // isub 556b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lsub 557b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fsub 558b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dsub 559b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // imul 560b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lmul 561b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fmul 562b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dmul 563b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // idiv 564b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ldiv 565b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fdiv 566b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ddiv 567b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // irem 568b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lrem 569b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // frem 570b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // drem 571b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ineg 572b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lneg 573b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fneg 574b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dneg 575b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ishl 576b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lshl 577b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ishr 578b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lshr 579b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iushr 580b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lushr 581b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iand 582b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // land 583b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ior 584b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lor 585b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ixor 586b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lxor 587b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iinc 588b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // i2l 589b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // i2f 590b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // i2d 591b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // l2i 592b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // l2f 593b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // l2d 594b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // f2i 595b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // f2l 596b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // f2d 597b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // d2i 598b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // d2l 599b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // d2f 600b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // i2b 601b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // i2c 602b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // i2s 603b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // lcmp 604b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fcmpl 605b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fcmpg 606b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // dcmpl 607b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // dcmpg 608b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ifeq 609b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ifne 610b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iflt 611b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ifge 612b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ifgt 613b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ifle 614b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ificmpeq 615b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ificmpne 616b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ificmplt 617b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ificmpge 618b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ificmpgt 619b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ificmple 620b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ifacmpeq 621b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ifacmpne 622b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // goto 623b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // jsr 624b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ret 625b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // tableswitch 626b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lookupswitch 627b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ireturn 628b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lreturn 629b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // freturn 630b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // dreturn 631b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // areturn 632b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // return 633b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // getstatic 634b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // putstatic 635b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // getfield 636b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // putfield 637b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // invokevirtual 638b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // invokespecial 639b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // invokestatic 640b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // invokeinterface 641b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 0, // invokedynamic 642b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // new 643b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // newarray 644b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // anewarray 645b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // arraylength 646b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // athrow 647b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // checkcast 648b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // instanceof 649b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // monitorenter 650b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // monitorexit 651b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // wide 652b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // multianewarray 653b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ifnull 654b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ifnonnull 655b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // goto_w 656b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // jsr_w 657b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato }; 658b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 659b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 660b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public byte opcode; 661b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 662b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 663b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 664b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the canonical opcode of this instruction, i.e. typically the 665b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * opcode whose extension has been removed. 666b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 667b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public byte canonicalOpcode() 668b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 669b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return opcode; 670b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 671b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 672b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 673b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 674b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Shrinks this instruction to its shortest possible form. 675b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return this instruction. 676b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 677b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public abstract Instruction shrink(); 678b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 679b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 680b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 681b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 682b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Writes the Instruction at the given offset in the given code attribute. 683b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 684b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public final void write(CodeAttribute codeAttribute, int offset) 685b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 686b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato write(codeAttribute.code, offset); 687b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 688b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 689b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 690b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 691b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Writes the Instruction at the given offset in the given code array. 692b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 693b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void write(byte[] code, int offset) 694b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 695b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Write the wide opcode, if necessary. 696b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (isWide()) 697b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 698b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato code[offset++] = InstructionConstants.OP_WIDE; 699b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 700b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 701b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Write the opcode. 702b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato code[offset++] = opcode; 703b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 704b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Write any additional arguments. 705b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeInfo(code, offset); 706b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 707b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 708b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 709b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 710b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns whether the instruction is wide, i.e. preceded by a wide opcode. 711b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * With the current specifications, only variable instructions can be wide. 712b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 713b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected boolean isWide() 714b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 715b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return false; 716b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 717b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 718b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 719b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 720b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Reads the data following the instruction opcode. 721b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 722b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected abstract void readInfo(byte[] code, int offset); 723b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 724b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 725b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 726b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Writes data following the instruction opcode. 727b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 728b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected abstract void writeInfo(byte[] code, int offset); 729b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 730b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 731b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 732b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the length in bytes of the instruction. 733b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 734b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public abstract int length(int offset); 735b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 736b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 737b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 738b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Accepts the given visitor. 739b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 740b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public abstract void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, InstructionVisitor instructionVisitor); 741b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 742b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 743b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 744b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns a description of the instruction, at the given offset. 745b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 746b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public String toString(int offset) 747b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 748b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return "["+offset+"] "+ this.toString(); 749b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 750b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 751b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 752b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 753b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the name of the instruction. 754b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 755b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public String getName() 756b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 757b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return InstructionConstants.NAMES[opcode & 0xff]; 758b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 759b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 760b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 761b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 762b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns whether the instruction is a Category 2 instruction. This means 763b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * that it operates on long or double arguments. 764b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 765b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean isCategory2() 766b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 767b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return IS_CATEGORY2[opcode & 0xff]; 768b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 769b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 770b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 771b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 772b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the number of entries popped from the stack during the execution 773b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * of the instruction. 774b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 775b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public int stackPopCount(Clazz clazz) 776b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 777b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return STACK_POP_COUNTS[opcode & 0xff]; 778b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 779b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 780b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 781b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 782b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the number of entries pushed onto the stack during the execution 783b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * of the instruction. 784b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 785b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public int stackPushCount(Clazz clazz) 786b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 787b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return STACK_PUSH_COUNTS[opcode & 0xff]; 788b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 789b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 790b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 791b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Small utility methods. 792b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 793b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected static int readByte(byte[] code, int offset) 794b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 795b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return code[offset] & 0xff; 796b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 797b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 798b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected static int readShort(byte[] code, int offset) 799b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 800b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return ((code[offset++] & 0xff) << 8) | 801b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ( code[offset ] & 0xff ); 802b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 803b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 804b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected static int readInt(byte[] code, int offset) 805b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 806b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return ( code[offset++] << 24) | 807b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ((code[offset++] & 0xff) << 16) | 808b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ((code[offset++] & 0xff) << 8) | 809b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ( code[offset ] & 0xff ); 810b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 811b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 812b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected static int readValue(byte[] code, int offset, int valueSize) 813b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 814b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato switch (valueSize) 815b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 816b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 0: return 0; 817b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 1: return readByte( code, offset); 818b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 2: return readShort(code, offset); 819b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 4: return readInt( code, offset); 820b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato default: throw new IllegalArgumentException("Unsupported value size ["+valueSize+"]"); 821b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 822b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 823b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 824b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected static int readSignedByte(byte[] code, int offset) 825b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 826b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return code[offset]; 827b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 828b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 829b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected static int readSignedShort(byte[] code, int offset) 830b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 831b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return (code[offset++] << 8) | 832b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato (code[offset ] & 0xff); 833b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 834b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 835b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected static int readSignedValue(byte[] code, int offset, int valueSize) 836b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 837b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato switch (valueSize) 838b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 839b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 0: return 0; 840b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 1: return readSignedByte( code, offset); 841b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 2: return readSignedShort(code, offset); 842b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 4: return readInt( code, offset); 843b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato default: throw new IllegalArgumentException("Unsupported value size ["+valueSize+"]"); 844b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 845b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 846b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 847b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected static void writeByte(byte[] code, int offset, int value) 848b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 849b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (value > 0xff) 850b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 851b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato throw new IllegalArgumentException("Unsigned byte value larger than 0xff ["+value+"]"); 852b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 853b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 854b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato code[offset] = (byte)value; 855b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 856b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 857b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected static void writeShort(byte[] code, int offset, int value) 858b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 859b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (value > 0xffff) 860b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 861b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato throw new IllegalArgumentException("Unsigned short value larger than 0xffff ["+value+"]"); 862b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 863b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 864b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato code[offset++] = (byte)(value >> 8); 865b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato code[offset ] = (byte)(value ); 866b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 867b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 868b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected static void writeInt(byte[] code, int offset, int value) 869b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 870b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato code[offset++] = (byte)(value >> 24); 871b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato code[offset++] = (byte)(value >> 16); 872b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato code[offset++] = (byte)(value >> 8); 873b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato code[offset ] = (byte)(value ); 874b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 875b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 876b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected static void writeValue(byte[] code, int offset, int value, int valueSize) 877b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 878b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato switch (valueSize) 879b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 880b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 0: break; 881b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 1: writeByte( code, offset, value); break; 882b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 2: writeShort(code, offset, value); break; 883b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 4: writeInt( code, offset, value); break; 884b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato default: throw new IllegalArgumentException("Unsupported value size ["+valueSize+"]"); 885b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 886b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 887b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 888b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected static void writeSignedByte(byte[] code, int offset, int value) 889b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 890b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if ((byte)value != value) 891b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 892b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato throw new IllegalArgumentException("Signed byte value out of range ["+value+"]"); 893b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 894b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 895b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato code[offset] = (byte)value; 896b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 897b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 898b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected static void writeSignedShort(byte[] code, int offset, int value) 899b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 900b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if ((short)value != value) 901b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 902b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato throw new IllegalArgumentException("Signed short value out of range ["+value+"]"); 903b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 904b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 905b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato code[offset++] = (byte)(value >> 8); 906b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato code[offset ] = (byte)(value ); 907b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 908b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 909b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected static void writeSignedValue(byte[] code, int offset, int value, int valueSize) 910b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 911b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato switch (valueSize) 912b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 913b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 0: break; 914b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 1: writeSignedByte( code, offset, value); break; 915b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 2: writeSignedShort(code, offset, value); break; 916b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 4: writeInt( code, offset, value); break; 917b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato default: throw new IllegalArgumentException("Unsupported value size ["+valueSize+"]"); 918b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 919b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 920b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 921