View Javadoc

    1   /*
    2    * Copyright  2000-2004 The Apache Software Foundation
    3    *
    4    *  Licensed under the Apache License, Version 2.0 (the "License");
    5    *  you may not use this file except in compliance with the License.
    6    *  You may obtain a copy of the License at
    7    *
    8    *      http://www.apache.org/licenses/LICENSE-2.0
    9    *
    10   *  Unless required by applicable law or agreed to in writing, software
    11   *  distributed under the License is distributed on an "AS IS" BASIS,
    12   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   *  See the License for the specific language governing permissions and
    14   *  limitations under the License.
    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 }