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 * This Instruction represents a simple instruction without variable arguments
29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * or constant pool references.
30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune
32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */
33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopublic class SimpleInstruction extends Instruction
34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{
35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public int constant;
36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Creates an uninitialized SimpleInstruction.
40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public SimpleInstruction() {}
42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Creates a new SimpleInstruction with the given opcode.
46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public SimpleInstruction(byte opcode)
48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        this(opcode, embeddedConstant(opcode));
50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Creates a new SimpleInstruction with the given opcode and constant.
55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public SimpleInstruction(byte opcode, int constant)
57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        this.opcode   = opcode;
59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        this.constant = constant;
60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Copies the given instruction into this instruction.
65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @param simpleInstruction the instruction to be copied.
66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * @return this instruction.
67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public SimpleInstruction copy(SimpleInstruction simpleInstruction)
69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        this.opcode   = simpleInstruction.opcode;
71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        this.constant = simpleInstruction.constant;
72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return this;
74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Return the embedded constant of the given opcode, or 0 if the opcode
79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * doesn't have one.
80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private static int embeddedConstant(byte opcode)
82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        switch (opcode)
84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_M1: return -1;
86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_1:
88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LCONST_1:
89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FCONST_1:
90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DCONST_1: return 1;
91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_2:
93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FCONST_2: return 2;
94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_3: return 3;
96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_4: return 4;
98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_5: return 5;
100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            default: return 0;
102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for Instruction.
107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public byte canonicalOpcode()
109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Replace any _1, _2, _3,... extension by _0.
111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        switch (opcode)
112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_M1:
114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_0:
115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_1:
116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_2:
117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_3:
118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_4:
119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_5:
120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_BIPUSH:
121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_SIPUSH:   return InstructionConstants.OP_ICONST_0;
122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LCONST_0:
124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LCONST_1: return InstructionConstants.OP_LCONST_0;
125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FCONST_0:
127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FCONST_1:
128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FCONST_2: return InstructionConstants.OP_FCONST_0;
129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DCONST_0:
131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DCONST_1: return InstructionConstants.OP_DCONST_0;
132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            default: return opcode;
134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public Instruction shrink()
138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Reconstruct the opcode of the shortest instruction, if there are
140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // any alternatives.
141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        switch (opcode)
142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_M1:
144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_0:
145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_1:
146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_2:
147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_3:
148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_4:
149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_ICONST_5:
150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_BIPUSH:
151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_SIPUSH:
152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                switch (requiredConstantSize())
153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    case 0:
155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        opcode = (byte)(InstructionConstants.OP_ICONST_0 + constant);
156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        break;
157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    case 1:
158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        opcode = InstructionConstants.OP_BIPUSH;
159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        break;
160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    case 2:
161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        opcode = InstructionConstants.OP_SIPUSH;
162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        break;
163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LCONST_0:
167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_LCONST_1:
168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                opcode = (byte)(InstructionConstants.OP_LCONST_0 + constant);
169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FCONST_0:
172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FCONST_1:
173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_FCONST_2:
174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                opcode = (byte)(InstructionConstants.OP_FCONST_0 + constant);
175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DCONST_0:
178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            case InstructionConstants.OP_DCONST_1:
179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                opcode = (byte)(InstructionConstants.OP_DCONST_0 + constant);
180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                break;
181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return this;
184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    protected void readInfo(byte[] code, int offset)
187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int constantSize = constantSize();
189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Also initialize embedded constants that are different from 0.
191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        constant = constantSize == 0 ?
192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            embeddedConstant(opcode) :
193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            readSignedValue(code, offset, constantSize);
194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    protected void writeInfo(byte[] code, int offset)
198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int constantSize = constantSize();
200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (requiredConstantSize() > constantSize)
202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            throw new IllegalArgumentException("Instruction has invalid constant size ("+this.toString(offset)+")");
204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        writeSignedValue(code, offset, constant, constantSize);
207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public int length(int offset)
211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return 1 + constantSize();
213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, InstructionVisitor instructionVisitor)
217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        instructionVisitor.visitSimpleInstruction(clazz, method, codeAttribute, offset, this);
219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for Object.
223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public String toString()
225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return getName() +
227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato               (constantSize() > 0 ? " "+constant : "");
228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Small utility methods.
232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the constant size for this instruction.
235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private int constantSize()
237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return opcode == InstructionConstants.OP_BIPUSH ||
239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato               opcode == InstructionConstants.OP_NEWARRAY ? 1 :
240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato               opcode == InstructionConstants.OP_SIPUSH   ? 2 :
241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                            0;
242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Computes the required constant size for this instruction.
247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private int requiredConstantSize()
249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return constant >= -1 && constant <= 5  ? 0 :
251b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang               (byte)constant  == constant      ? 1 :
252b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang               (short)constant == constant      ? 2 :
253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                  4;
254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
255b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
256