1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.bcel.classfile;
18
19 import java.io.DataInputStream;
20 import java.io.DataOutputStream;
21 import java.io.IOException;
22
23 /***
24 * This class represents a stack map entry recording the types of
25 * local variables and the the of stack items at a given byte code offset.
26 * See CLDC specification ß5.3.1.2
27 *
28 * @version $Id: StackMapEntry.java 386056 2006-03-15 11:31:56Z tcurdt $
29 * @author <A HREF="mailto:m.dahm@gmx.de">M. Dahm</A>
30 * @see StackMap
31 * @see StackMapType
32 */
33 public final class StackMapEntry implements Cloneable {
34
35 private int byte_code_offset;
36 private int number_of_locals;
37 private StackMapType[] types_of_locals;
38 private int number_of_stack_items;
39 private StackMapType[] types_of_stack_items;
40 private ConstantPool constant_pool;
41
42
43 /***
44 * Construct object from file stream.
45 * @param file Input stream
46 * @throws IOException
47 */
48 StackMapEntry(DataInputStream file, ConstantPool constant_pool) throws IOException {
49 this(file.readShort(), file.readShort(), null, -1, null, constant_pool);
50 types_of_locals = new StackMapType[number_of_locals];
51 for (int i = 0; i < number_of_locals; i++) {
52 types_of_locals[i] = new StackMapType(file, constant_pool);
53 }
54 number_of_stack_items = file.readShort();
55 types_of_stack_items = new StackMapType[number_of_stack_items];
56 for (int i = 0; i < number_of_stack_items; i++) {
57 types_of_stack_items[i] = new StackMapType(file, constant_pool);
58 }
59 }
60
61
62 public StackMapEntry(int byte_code_offset, int number_of_locals,
63 StackMapType[] types_of_locals, int number_of_stack_items,
64 StackMapType[] types_of_stack_items, ConstantPool constant_pool) {
65 this.byte_code_offset = byte_code_offset;
66 this.number_of_locals = number_of_locals;
67 this.types_of_locals = types_of_locals;
68 this.number_of_stack_items = number_of_stack_items;
69 this.types_of_stack_items = types_of_stack_items;
70 this.constant_pool = constant_pool;
71 }
72
73
74 /***
75 * Dump stack map entry
76 *
77 * @param file Output file stream
78 * @throws IOException
79 */
80 public final void dump( DataOutputStream file ) throws IOException {
81 file.writeShort(byte_code_offset);
82 file.writeShort(number_of_locals);
83 for (int i = 0; i < number_of_locals; i++) {
84 types_of_locals[i].dump(file);
85 }
86 file.writeShort(number_of_stack_items);
87 for (int i = 0; i < number_of_stack_items; i++) {
88 types_of_stack_items[i].dump(file);
89 }
90 }
91
92
93 /***
94 * @return String representation.
95 */
96 public final String toString() {
97 StringBuffer buf = new StringBuffer(64);
98 buf.append("(offset=").append(byte_code_offset);
99 if (number_of_locals > 0) {
100 buf.append(", locals={");
101 for (int i = 0; i < number_of_locals; i++) {
102 buf.append(types_of_locals[i]);
103 if (i < number_of_locals - 1) {
104 buf.append(", ");
105 }
106 }
107 buf.append("}");
108 }
109 if (number_of_stack_items > 0) {
110 buf.append(", stack items={");
111 for (int i = 0; i < number_of_stack_items; i++) {
112 buf.append(types_of_stack_items[i]);
113 if (i < number_of_stack_items - 1) {
114 buf.append(", ");
115 }
116 }
117 buf.append("}");
118 }
119 buf.append(")");
120 return buf.toString();
121 }
122
123
124 public void setByteCodeOffset( int b ) {
125 byte_code_offset = b;
126 }
127
128
129 public int getByteCodeOffset() {
130 return byte_code_offset;
131 }
132
133
134 public void setNumberOfLocals( int n ) {
135 number_of_locals = n;
136 }
137
138
139 public int getNumberOfLocals() {
140 return number_of_locals;
141 }
142
143
144 public void setTypesOfLocals( StackMapType[] t ) {
145 types_of_locals = t;
146 }
147
148
149 public StackMapType[] getTypesOfLocals() {
150 return types_of_locals;
151 }
152
153
154 public void setNumberOfStackItems( int n ) {
155 number_of_stack_items = n;
156 }
157
158
159 public int getNumberOfStackItems() {
160 return number_of_stack_items;
161 }
162
163
164 public void setTypesOfStackItems( StackMapType[] t ) {
165 types_of_stack_items = t;
166 }
167
168
169 public StackMapType[] getTypesOfStackItems() {
170 return types_of_stack_items;
171 }
172
173
174 /***
175 * @return deep copy of this object
176 */
177 public StackMapEntry copy() {
178 try {
179 return (StackMapEntry) clone();
180 } catch (CloneNotSupportedException e) {
181 }
182 return null;
183 }
184
185
186 /***
187 * Called by objects that are traversing the nodes of the tree implicitely
188 * defined by the contents of a Java class. I.e., the hierarchy of methods,
189 * fields, attributes, etc. spawns a tree of objects.
190 *
191 * @param v Visitor object
192 */
193 public void accept( Visitor v ) {
194 v.visitStackMapEntry(this);
195 }
196
197
198 /***
199 * @return Constant pool used by this object.
200 */
201 public final ConstantPool getConstantPool() {
202 return constant_pool;
203 }
204
205
206 /***
207 * @param constant_pool Constant pool to be used for this object.
208 */
209 public final void setConstantPool( ConstantPool constant_pool ) {
210 this.constant_pool = constant_pool;
211 }
212 }