1 package org.apache.bcel.generic;
2
3 /* ====================================================================
4 * The Apache Software License, Version 1.1
5 *
6 * Copyright (c) 2001 The Apache Software Foundation. All rights
7 * reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 *
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 *
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in
18 * the documentation and/or other materials provided with the
19 * distribution.
20 *
21 * 3. The end-user documentation included with the redistribution,
22 * if any, must include the following acknowledgment:
23 * "This product includes software developed by the
24 * Apache Software Foundation (http://www.apache.org/)."
25 * Alternately, this acknowledgment may appear in the software itself,
26 * if and wherever such third-party acknowledgments normally appear.
27 *
28 * 4. The names "Apache" and "Apache Software Foundation" and
29 * "Apache BCEL" must not be used to endorse or promote products
30 * derived from this software without prior written permission. For
31 * written permission, please contact apache@apache.org.
32 *
33 * 5. Products derived from this software may not be called "Apache",
34 * "Apache BCEL", nor may "Apache" appear in their name, without
35 * prior written permission of the Apache Software Foundation.
36 *
37 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
38 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
39 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
40 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
41 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
42 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
43 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
44 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
45 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
46 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
47 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
48 * SUCH DAMAGE.
49 * ====================================================================
50 *
51 * This software consists of voluntary contributions made by many
52 * individuals on behalf of the Apache Software Foundation. For more
53 * information on the Apache Software Foundation, please see
54 * <http://www.apache.org/>.
55 */
56
57 import java.io.*;
58 import org.apache.bcel.util.ByteSequence;
59 import org.apache.bcel.Constants;
60 import org.apache.bcel.classfile.*;
61
62 /***
63 * Abstract super class for instructions that use an index into the
64 * constant pool such as LDC, INVOKEVIRTUAL, etc.
65 *
66 * @see ConstantPoolGen
67 * @see LDC
68 * @see INVOKEVIRTUAL
69 *
70 * @version $Id: CPInstruction.java,v 1.1.1.1 2001/10/29 20:00:07 jvanzyl Exp $
71 * @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
72 */
73 public abstract class CPInstruction extends Instruction
74 implements TypedInstruction, IndexedInstruction
75 {
76 protected int index; // index to constant pool
77
78 /***
79 * Empty constructor needed for the Class.newInstance() statement in
80 * Instruction.readInstruction(). Not to be used otherwise.
81 */
82 CPInstruction() {}
83
84 /***
85 * @param index to constant pool
86 */
87 protected CPInstruction(short opcode, int index) {
88 super(opcode, (short)3);
89 setIndex(index);
90 }
91
92 /***
93 * Dump instruction as byte code to stream out.
94 * @param out Output stream
95 */
96 public void dump(DataOutputStream out) throws IOException {
97 out.writeByte(opcode);
98 out.writeShort(index);
99 }
100
101 /***
102 * Long output format:
103 *
104 * <name of opcode> "["<opcode number>"]"
105 * "("<length of instruction>")" "<"< constant pool index>">"
106 *
107 * @param verbose long/short format switch
108 * @return mnemonic for instruction
109 */
110 public String toString(boolean verbose) {
111 return super.toString(verbose) + " " + index;
112 }
113
114 /***
115 * @return mnemonic for instruction with symbolic references resolved
116 */
117 public String toString(ConstantPool cp) {
118 Constant c = cp.getConstant(index);
119 String str = cp.constantToString(c);
120
121 if(c instanceof ConstantClass)
122 str = str.replace('.', '/');
123
124 return org.apache.bcel.Constants.OPCODE_NAMES[opcode] + " " + str;
125 }
126
127 /***
128 * Read needed data (i.e., index) from file.
129 * @param bytes input stream
130 * @param wide wide prefix?
131 */
132 protected void initFromFile(ByteSequence bytes, boolean wide)
133 throws IOException
134 {
135 setIndex(bytes.readUnsignedShort());
136 length = 3;
137 }
138
139 /***
140 * @return index in constant pool referred by this instruction.
141 */
142 public final int getIndex() { return index; }
143
144 /***
145 * Set the index to constant pool.
146 * @param index in constant pool.
147 */
148 public void setIndex(int index) {
149 if(index < 0)
150 throw new ClassGenException("Negative index value: " + index);
151
152 this.index = index;
153 }
154
155 /*** @return type related with this instruction.
156 */
157 public Type getType(ConstantPoolGen cpg) {
158 ConstantPool cp = cpg.getConstantPool();
159 String name = cp.getConstantString(index, org.apache.bcel.Constants.CONSTANT_Class);
160
161 if(!name.startsWith("["))
162 name = "L" + name + ";";
163
164 return Type.getType(name);
165 }
166 }
This page was automatically generated by Maven