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