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.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{ 342270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // An array for marking instructions that may throw exceptions. 352270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom private static final boolean[] MAY_THROW_EXCEPTIONS = new boolean[] 362270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 372270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // nop 382270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // aconst_null 392270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // iconst_m1 402270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // iconst_0 412270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // iconst_1 422270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // iconst_2 432270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // iconst_3 442270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // iconst_4 452270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // iconst_5 462270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // lconst_0 472270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // lconst_1 482270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // fconst_0 492270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // fconst_1 502270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // fconst_2 512270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // dconst_0 522270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // dconst_1 532270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // bipush 542270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // sipush 552270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // ldc 562270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // ldc_w 572270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // ldc2_w 582270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // iload 592270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // lload 602270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // fload 612270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // dload 622270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // aload 632270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // iload_0 642270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // iload_1 652270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // iload_2 662270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // iload_3 672270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // lload_0 682270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // lload_1 692270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // lload_2 702270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // lload_3 712270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // fload_0 722270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // fload_1 732270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // fload_2 742270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // fload_3 752270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // dload_0 762270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // dload_1 772270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // dload_2 782270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // dload_3 792270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // aload_0 802270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // aload_1 812270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // aload_2 822270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // aload_3 832270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // iaload 842270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // laload 852270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // faload 862270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // daload 872270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // aaload 882270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // baload 892270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // caload 902270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // saload 912270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // istore 922270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // lstore 932270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // fstore 942270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // dstore 952270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // astore 962270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // istore_0 972270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // istore_1 982270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // istore_2 992270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // istore_3 1002270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // lstore_0 1012270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // lstore_1 1022270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // lstore_2 1032270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // lstore_3 1042270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // fstore_0 1052270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // fstore_1 1062270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // fstore_2 1072270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // fstore_3 1082270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // dstore_0 1092270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // dstore_1 1102270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // dstore_2 1112270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // dstore_3 1122270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // astore_0 1132270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // astore_1 1142270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // astore_2 1152270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // astore_3 1162270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // iastore 1172270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // lastore 1182270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // fastore 1192270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // dastore 1202270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // aastore 1212270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // bastore 1222270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // castore 1232270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // sastore 1242270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // pop 1252270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // pop2 1262270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // dup 1272270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // dup_x1 1282270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // dup_x2 1292270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // dup2 1302270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // dup2_x1 1312270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // dup2_x2 1322270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // swap 1332270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // iadd 1342270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // ladd 1352270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // fadd 1362270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // dadd 1372270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // isub 1382270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // lsub 1392270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // fsub 1402270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // dsub 1412270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // imul 1422270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // lmul 1432270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // fmul 1442270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // dmul 1452270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // idiv 1462270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // ldiv 1472270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // fdiv 1482270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // ddiv 1492270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // irem 1502270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // lrem 1512270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // frem 1522270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // drem 1532270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // ineg 1542270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // lneg 1552270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // fneg 1562270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // dneg 1572270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // ishl 1582270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // lshl 1592270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // ishr 1602270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // lshr 1612270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // iushr 1622270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // lushr 1632270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // iand 1642270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // land 1652270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // ior 1662270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // lor 1672270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // ixor 1682270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // lxor 1692270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // iinc 1702270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // i2l 1712270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // i2f 1722270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // i2d 1732270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // l2i 1742270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // l2f 1752270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // l2d 1762270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // f2i 1772270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // f2l 1782270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // f2d 1792270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // d2i 1802270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // d2l 1812270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // d2f 1822270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // i2b 1832270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // i2c 1842270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // i2s 1852270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // lcmp 1862270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // fcmpl 1872270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // fcmpg 1882270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // dcmpl 1892270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // dcmpg 1902270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // ifeq 1912270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // ifne 1922270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // iflt 1932270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // ifge 1942270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // ifgt 1952270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // ifle 1962270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // ificmpeq 1972270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // ificmpne 1982270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // ificmplt 1992270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // ificmpge 2002270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // ificmpgt 2012270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // ificmple 2022270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // ifacmpeq 2032270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // ifacmpne 2042270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // goto 2052270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // jsr 2062270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // ret 2072270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // tableswitch 2082270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // lookupswitch 2092270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // ireturn 2102270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // lreturn 2112270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // freturn 2122270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // dreturn 2132270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // areturn 2142270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // return 2152270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // getstatic 2162270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // putstatic 2172270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // getfield 2182270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // putfield 2192270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // invokevirtual 2202270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // invokespecial 2212270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // invokestatic 2222270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // invokeinterface 2232270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // invokedynamic 2242270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // new 2252270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // newarray 2262270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // anewarray 2272270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // arraylength 2282270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // athrow 2292270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // checkcast 2302270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // instanceof 2312270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // monitorenter 2322270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // monitorexit 2332270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // wide 2342270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom true, // multianewarray 2352270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // ifnull 2362270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // ifnonnull 2372270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // goto_w 2382270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom false, // jsr_w 2392270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom }; 2402270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 2412270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // An array for marking Category 2 instructions. 243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static final boolean[] IS_CATEGORY2 = new boolean[] 244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // nop 246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // aconst_null 247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iconst_m1 248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iconst_0 249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iconst_1 250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iconst_2 251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iconst_3 252b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iconst_4 253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iconst_5 254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lconst_0 255b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lconst_1 256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fconst_0 257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fconst_1 258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fconst_2 259b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dconst_0 260b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dconst_1 261b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // bipush 262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // sipush 263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ldc 264b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ldc_w 265b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // ldc2_w 266b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iload 267b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lload 268b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fload 269b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dload 270b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // aload 271b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iload_0 272b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iload_1 273b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iload_2 274b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iload_3 275b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lload_0 276b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lload_1 277b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lload_2 278b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lload_3 279b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fload_0 280b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fload_1 281b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fload_2 282b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fload_3 283b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dload_0 284b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dload_1 285b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dload_2 286b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dload_3 287b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // aload_0 288b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // aload_1 289b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // aload_2 290b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // aload_3 291b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iaload 292b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // laload 293b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // faload 294b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // daload 295b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // aaload 296b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // baload 297b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // caload 298b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // saload 299b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // istore 300b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lstore 301b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fstore 302b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dstore 303b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // astore 304b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // istore_0 305b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // istore_1 306b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // istore_2 307b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // istore_3 308b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lstore_0 309b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lstore_1 310b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lstore_2 311b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lstore_3 312b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fstore_0 313b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fstore_1 314b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fstore_2 315b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fstore_3 316b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dstore_0 317b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dstore_1 318b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dstore_2 319b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dstore_3 320b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // astore_0 321b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // astore_1 322b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // astore_2 323b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // astore_3 324b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iastore 325b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lastore 326b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fastore 327b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dastore 328b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // aastore 329b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // bastore 330b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // castore 331b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // sastore 332b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // pop 333b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // pop2 334b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // dup 335b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // dup_x1 336b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // dup_x2 337b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dup2 338b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dup2_x1 339b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dup2_x2 340b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // swap 341b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iadd 342b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // ladd 343b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fadd 344b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dadd 345b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // isub 346b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lsub 347b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fsub 348b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dsub 349b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // imul 350b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lmul 351b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fmul 352b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dmul 353b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // idiv 354b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // ldiv 355b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fdiv 356b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // ddiv 357b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // irem 358b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lrem 359b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // frem 360b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // drem 361b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ineg 362b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lneg 363b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fneg 364b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dneg 365b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ishl 366b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lshl 367b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ishr 368b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lshr 369b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iushr 370b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lushr 371b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iand 372b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // land 373b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ior 374b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lor 375b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ixor 376b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lxor 377b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iinc 378b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // i2l 379b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // i2f 380b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // i2d 381b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // l2i 382b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // l2f 383b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // l2d 384b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // f2i 385b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // f2l 386b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // f2d 387b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // d2i 388b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // d2l 389b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // d2f 390b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // i2b 391b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // i2c 392b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // i2s 393b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lcmp 394b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fcmpl 395b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // fcmpg 396b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dcmpl 397b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dcmpg 398b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ifeq 399b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ifne 400b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // iflt 401b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ifge 402b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ifgt 403b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ifle 404b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ificmpeq 405b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ificmpne 406b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ificmplt 407b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ificmpge 408b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ificmpgt 409b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ificmple 410b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ifacmpeq 411b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ifacmpne 412b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // goto 413b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // jsr 414b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ret 415b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // tableswitch 416b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // lookupswitch 417b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ireturn 418b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // lreturn 419b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // freturn 420b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato true, // dreturn 421b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // areturn 422b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // return 423b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // getstatic 424b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // putstatic 425b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // getfield 426b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // putfield 427b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // invokevirtual 428b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // invokespecial 429b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // invokestatic 430b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // invokeinterface 431b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang false, // invokedynamic 432b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // new 433b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // newarray 434b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // anewarray 435b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // arraylength 436b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // athrow 437b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // checkcast 438b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // instanceof 439b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // monitorenter 440b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // monitorexit 441b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // wide 442b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // multianewarray 443b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ifnull 444b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // ifnonnull 445b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // goto_w 446b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato false, // jsr_w 447b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato }; 448b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 449b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 450b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // An array containing the fixed number of entries popped from the stack, 451b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // for all instructions. 452b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static final int[] STACK_POP_COUNTS = new int[] 453b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 454b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // nop 455b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // aconst_null 456b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iconst_m1 457b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iconst_0 458b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iconst_1 459b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iconst_2 460b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iconst_3 461b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iconst_4 462b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iconst_5 463b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lconst_0 464b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lconst_1 465b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // fconst_0 466b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // fconst_1 467b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // fconst_2 468b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // dconst_0 469b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // dconst_1 470b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // bipush 471b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // sipush 472b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ldc 473b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ldc_w 474b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ldc2_w 475b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iload 476b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lload 477b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // fload 478b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // dload 479b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // aload 480b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iload_0 481b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iload_1 482b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iload_2 483b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iload_3 484b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lload_0 485b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lload_1 486b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lload_2 487b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lload_3 488b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // fload_0 489b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // fload_1 490b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // fload_2 491b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // fload_3 492b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // dload_0 493b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // dload_1 494b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // dload_2 495b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // dload_3 496b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // aload_0 497b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // aload_1 498b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // aload_2 499b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // aload_3 500b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // iaload 501b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // laload 502b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // faload 503b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // daload 504b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // aaload 505b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // baload 506b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // caload 507b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // saload 508b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // istore 509b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lstore 510b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fstore 511b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dstore 512b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // astore 513b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // istore_0 514b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // istore_1 515b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // istore_2 516b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // istore_3 517b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lstore_0 518b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lstore_1 519b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lstore_2 520b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lstore_3 521b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fstore_0 522b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fstore_1 523b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fstore_2 524b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fstore_3 525b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dstore_0 526b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dstore_1 527b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dstore_2 528b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dstore_3 529b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // astore_0 530b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // astore_1 531b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // astore_2 532b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // astore_3 533b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 3, // iastore 534b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // lastore 535b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 3, // fastore 536b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // dastore 537b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 3, // aastore 538b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 3, // bastore 539b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 3, // castore 540b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 3, // sastore 541b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // pop 542b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // pop2 543b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // dup 544b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dup_x1 545b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 3, // dup_x2 546b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dup2 547b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 3, // dup2_x1 548b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // dup2_x2 549b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // swap 550b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // iadd 551b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // ladd 552b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // fadd 553b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // dadd 554b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // isub 555b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // lsub 556b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // fsub 557b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // dsub 558b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // imul 559b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // lmul 560b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // fmul 561b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // dmul 562b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // idiv 563b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // ldiv 564b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // fdiv 565b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // ddiv 566b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // irem 567b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // lrem 568b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // frem 569b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // drem 570b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ineg 571b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lneg 572b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fneg 573b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dneg 574b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ishl 575b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 3, // lshl 576b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ishr 577b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 3, // lshr 578b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // iushr 579b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 3, // lushr 580b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // iand 581b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // land 582b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ior 583b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // lor 584b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ixor 585b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // lxor 586b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iinc 587b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // i2l 588b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // i2f 589b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // i2d 590b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // l2i 591b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // l2f 592b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // l2d 593b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // f2i 594b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // f2l 595b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // f2d 596b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // d2i 597b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // d2l 598b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // d2f 599b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // i2b 600b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // i2c 601b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // i2s 602b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // lcmp 603b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // fcmpl 604b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // fcmpg 605b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // dcmpl 606b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // dcmpg 607b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ifeq 608b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ifne 609b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iflt 610b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ifge 611b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ifgt 612b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ifle 613b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ificmpeq 614b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ificmpne 615b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ificmplt 616b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ificmpge 617b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ificmpgt 618b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ificmple 619b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ifacmpeq 620b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ifacmpne 621b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // goto 622b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // jsr 623b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ret 624b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // tableswitch 625b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // lookupswitch 626b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ireturn 627b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lreturn 628b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // freturn 629b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dreturn 630b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // areturn 631b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // return 632b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // getstatic 633b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // putstatic 634b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // getfield 635b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // putfield 636b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // invokevirtual 637b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // invokespecial 638b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // invokestatic 639b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // invokeinterface 640b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 0, // invokedynamic 641b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // new 642b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // newarray 643b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // anewarray 644b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // arraylength 645b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // athrow 646b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // checkcast 647b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // instanceof 648b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // monitorenter 649b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // monitorexit 650b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // wide 651b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // multianewarray 652b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ifnull 653b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ifnonnull 654b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // goto_w 655b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // jsr_w 656b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato }; 657b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 658b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 659b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // An array containing the fixed number of entries pushed onto the stack, 660b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // for all instructions. 661b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static final int[] STACK_PUSH_COUNTS = new int[] 662b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 663b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // nop 664b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // aconst_null 665b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iconst_m1 666b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iconst_0 667b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iconst_1 668b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iconst_2 669b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iconst_3 670b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iconst_4 671b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iconst_5 672b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lconst_0 673b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lconst_1 674b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fconst_0 675b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fconst_1 676b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fconst_2 677b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dconst_0 678b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dconst_1 679b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // bipush 680b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // sipush 681b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ldc 682b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ldc_w 683b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ldc2_w 684b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iload 685b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lload 686b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fload 687b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dload 688b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // aload 689b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iload_0 690b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iload_1 691b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iload_2 692b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iload_3 693b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lload_0 694b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lload_1 695b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lload_2 696b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lload_3 697b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fload_0 698b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fload_1 699b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fload_2 700b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fload_3 701b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dload_0 702b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dload_1 703b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dload_2 704b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dload_3 705b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // aload_0 706b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // aload_1 707b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // aload_2 708b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // aload_3 709b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iaload 710b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // laload 711b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // faload 712b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // daload 713b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // aaload 714b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // baload 715b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // caload 716b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // saload 717b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // istore 718b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lstore 719b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // fstore 720b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // dstore 721b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // astore 722b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // istore_0 723b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // istore_1 724b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // istore_2 725b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // istore_3 726b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lstore_0 727b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lstore_1 728b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lstore_2 729b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lstore_3 730b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // fstore_0 731b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // fstore_1 732b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // fstore_2 733b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // fstore_3 734b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // dstore_0 735b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // dstore_1 736b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // dstore_2 737b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // dstore_3 738b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // astore_0 739b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // astore_1 740b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // astore_2 741b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // astore_3 742b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iastore 743b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lastore 744b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // fastore 745b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // dastore 746b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // aastore 747b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // bastore 748b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // castore 749b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // sastore 750b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // pop 751b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // pop2 752b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dup 753b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 3, // dup_x1 754b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // dup_x2 755b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 4, // dup2 756b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 5, // dup2_x1 757b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 6, // dup2_x2 758b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // swap 759b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iadd 760b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ladd 761b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fadd 762b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dadd 763b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // isub 764b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lsub 765b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fsub 766b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dsub 767b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // imul 768b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lmul 769b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fmul 770b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dmul 771b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // idiv 772b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ldiv 773b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fdiv 774b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // ddiv 775b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // irem 776b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lrem 777b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // frem 778b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // drem 779b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ineg 780b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lneg 781b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fneg 782b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // dneg 783b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ishl 784b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lshl 785b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ishr 786b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lshr 787b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iushr 788b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lushr 789b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // iand 790b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // land 791b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ior 792b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lor 793b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // ixor 794b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // lxor 795b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iinc 796b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // i2l 797b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // i2f 798b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // i2d 799b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // l2i 800b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // l2f 801b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // l2d 802b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // f2i 803b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // f2l 804b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // f2d 805b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // d2i 806b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2, // d2l 807b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // d2f 808b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // i2b 809b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // i2c 810b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // i2s 811b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // lcmp 812b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fcmpl 813b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // fcmpg 814b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // dcmpl 815b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // dcmpg 816b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ifeq 817b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ifne 818b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // iflt 819b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ifge 820b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ifgt 821b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ifle 822b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ificmpeq 823b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ificmpne 824b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ificmplt 825b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ificmpge 826b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ificmpgt 827b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ificmple 828b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ifacmpeq 829b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ifacmpne 830b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // goto 831b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // jsr 832b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ret 833b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // tableswitch 834b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lookupswitch 835b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ireturn 836b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // lreturn 837b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // freturn 838b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // dreturn 839b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // areturn 840b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // return 841b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // getstatic 842b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // putstatic 843b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // getfield 844b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // putfield 845b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // invokevirtual 846b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // invokespecial 847b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // invokestatic 848b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // invokeinterface 849b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 0, // invokedynamic 850b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // new 851b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // newarray 852b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // anewarray 853b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // arraylength 854b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // athrow 855b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // checkcast 856b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // instanceof 857b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // monitorenter 858b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // monitorexit 859b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // wide 860b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // multianewarray 861b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ifnull 862b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // ifnonnull 863b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 0, // goto_w 864b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1, // jsr_w 865b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato }; 866b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 867b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 868b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public byte opcode; 869b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 870b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 871b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 872b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the canonical opcode of this instruction, i.e. typically the 873b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * opcode whose extension has been removed. 874b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 875b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public byte canonicalOpcode() 876b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 877b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return opcode; 878b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 879b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 880b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 881b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 882b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Shrinks this instruction to its shortest possible form. 883b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @return this instruction. 884b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 885b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public abstract Instruction shrink(); 886b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 887b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 888b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 889b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 890b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Writes the Instruction at the given offset in the given code attribute. 891b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 892b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public final void write(CodeAttribute codeAttribute, int offset) 893b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 894b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato write(codeAttribute.code, offset); 895b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 896b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 897b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 898b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 899b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Writes the Instruction at the given offset in the given code array. 900b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 901b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void write(byte[] code, int offset) 902b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 903b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Write the wide opcode, if necessary. 904b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (isWide()) 905b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 906b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato code[offset++] = InstructionConstants.OP_WIDE; 907b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 908b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 909b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Write the opcode. 910b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato code[offset++] = opcode; 911b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 912b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Write any additional arguments. 913b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato writeInfo(code, offset); 914b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 915b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 916b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 917b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 918b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns whether the instruction is wide, i.e. preceded by a wide opcode. 919b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * With the current specifications, only variable instructions can be wide. 920b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 921b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected boolean isWide() 922b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 923b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return false; 924b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 925b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 926b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 927b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 928b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Reads the data following the instruction opcode. 929b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 930b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected abstract void readInfo(byte[] code, int offset); 931b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 932b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 933b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 934b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Writes data following the instruction opcode. 935b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 936b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected abstract void writeInfo(byte[] code, int offset); 937b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 938b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 939b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 940b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the length in bytes of the instruction. 941b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 942b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public abstract int length(int offset); 943b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 944b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 945b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 946b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Accepts the given visitor. 947b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 948b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public abstract void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, InstructionVisitor instructionVisitor); 949b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 950b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 951b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 952b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns a description of the instruction, at the given offset. 953b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 954b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public String toString(int offset) 955b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 956b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return "["+offset+"] "+ this.toString(); 957b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 958b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 959b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 960b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 961b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the name of the instruction. 962b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 963b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public String getName() 964b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 965b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return InstructionConstants.NAMES[opcode & 0xff]; 966b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 967b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 968b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 969b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 9702270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * Returns whether the instruction may throw exceptions. 9712270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom */ 9722270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom public boolean mayThrowExceptions() 9732270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 9742270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom return MAY_THROW_EXCEPTIONS[opcode & 0xff]; 9752270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 9762270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 9772270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 9782270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom /** 979b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns whether the instruction is a Category 2 instruction. This means 980b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * that it operates on long or double arguments. 981b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 982b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean isCategory2() 983b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 984b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return IS_CATEGORY2[opcode & 0xff]; 985b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 986b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 987b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 988b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 989b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the number of entries popped from the stack during the execution 990b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * of the instruction. 991b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 992b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public int stackPopCount(Clazz clazz) 993b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 994b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return STACK_POP_COUNTS[opcode & 0xff]; 995b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 996b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 997b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 998b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 999b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns the number of entries pushed onto the stack during the execution 1000b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * of the instruction. 1001b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1002b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public int stackPushCount(Clazz clazz) 1003b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1004b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return STACK_PUSH_COUNTS[opcode & 0xff]; 1005b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1006b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1007b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1008b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Small utility methods. 1009b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1010b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected static int readByte(byte[] code, int offset) 1011b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1012b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return code[offset] & 0xff; 1013b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1014b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1015b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected static int readShort(byte[] code, int offset) 1016b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1017b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return ((code[offset++] & 0xff) << 8) | 1018b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ( code[offset ] & 0xff ); 1019b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1020b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1021b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected static int readInt(byte[] code, int offset) 1022b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1023b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return ( code[offset++] << 24) | 1024b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ((code[offset++] & 0xff) << 16) | 1025b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ((code[offset++] & 0xff) << 8) | 1026b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ( code[offset ] & 0xff ); 1027b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1028b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1029b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected static int readValue(byte[] code, int offset, int valueSize) 1030b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1031b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato switch (valueSize) 1032b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1033b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 0: return 0; 1034b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 1: return readByte( code, offset); 1035b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 2: return readShort(code, offset); 1036b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 4: return readInt( code, offset); 1037b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato default: throw new IllegalArgumentException("Unsupported value size ["+valueSize+"]"); 1038b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1039b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1040b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1041b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected static int readSignedByte(byte[] code, int offset) 1042b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1043b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return code[offset]; 1044b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1045b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1046b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected static int readSignedShort(byte[] code, int offset) 1047b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1048b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return (code[offset++] << 8) | 1049b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato (code[offset ] & 0xff); 1050b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1051b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1052b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected static int readSignedValue(byte[] code, int offset, int valueSize) 1053b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1054b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato switch (valueSize) 1055b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1056b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 0: return 0; 1057b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 1: return readSignedByte( code, offset); 1058b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 2: return readSignedShort(code, offset); 1059b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 4: return readInt( code, offset); 1060b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato default: throw new IllegalArgumentException("Unsupported value size ["+valueSize+"]"); 1061b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1062b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1063b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1064b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected static void writeByte(byte[] code, int offset, int value) 1065b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1066b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (value > 0xff) 1067b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1068b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato throw new IllegalArgumentException("Unsigned byte value larger than 0xff ["+value+"]"); 1069b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1070b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1071b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato code[offset] = (byte)value; 1072b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1073b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1074b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected static void writeShort(byte[] code, int offset, int value) 1075b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1076b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (value > 0xffff) 1077b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1078b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato throw new IllegalArgumentException("Unsigned short value larger than 0xffff ["+value+"]"); 1079b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1080b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1081b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato code[offset++] = (byte)(value >> 8); 1082b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato code[offset ] = (byte)(value ); 1083b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1084b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1085b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected static void writeInt(byte[] code, int offset, int value) 1086b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1087b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato code[offset++] = (byte)(value >> 24); 1088b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato code[offset++] = (byte)(value >> 16); 1089b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato code[offset++] = (byte)(value >> 8); 1090b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato code[offset ] = (byte)(value ); 1091b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1092b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1093b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected static void writeValue(byte[] code, int offset, int value, int valueSize) 1094b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1095b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato switch (valueSize) 1096b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1097b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 0: break; 1098b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 1: writeByte( code, offset, value); break; 1099b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 2: writeShort(code, offset, value); break; 1100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 4: writeInt( code, offset, value); break; 1101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato default: throw new IllegalArgumentException("Unsupported value size ["+valueSize+"]"); 1102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected static void writeSignedByte(byte[] code, int offset, int value) 1106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1107b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if ((byte)value != value) 1108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato throw new IllegalArgumentException("Signed byte value out of range ["+value+"]"); 1110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato code[offset] = (byte)value; 1113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected static void writeSignedShort(byte[] code, int offset, int value) 1116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1117b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if ((short)value != value) 1118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato throw new IllegalArgumentException("Signed short value out of range ["+value+"]"); 1120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato code[offset++] = (byte)(value >> 8); 1123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato code[offset ] = (byte)(value ); 1124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato protected static void writeSignedValue(byte[] code, int offset, int value, int valueSize) 1127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato switch (valueSize) 1129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 1130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 0: break; 1131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 1: writeSignedByte( code, offset, value); break; 1132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 2: writeSignedShort(code, offset, value); break; 1133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato case 4: writeInt( code, offset, value); break; 1134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato default: throw new IllegalArgumentException("Unsupported value size ["+valueSize+"]"); 1135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 1137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 1138