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