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