    View Javadoc
    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