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