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  import java.io.Serializable;
    23  import org.apache.bcel.Constants;
    24
    25  /***
    26   * This class represents an entry in the exception table of the <em>Code</em>
    27   * attribute and is used only there. It contains a range in which a
    28   * particular exception handler is active.
    29   *
    30   * @version $Id: CodeException.java 386056 2006-03-15 11:31:56Z tcurdt $
    31   * @author  <A HREF="mailto:m.dahm@gmx.de">M. Dahm</A>
    32   * @see     Code
    33   */
    34  public final class CodeException implements Cloneable, Constants, Node, Serializable {
    35
    36      private int start_pc; // Range in the code the exception handler is
    37      private int end_pc; // active. start_pc is inclusive, end_pc exclusive
    38      private int handler_pc; /* Starting address of exception handler, i.e.,
    39       * an offset from start of code.
    40       */
    41      private int catch_type; /* If this is zero the handler catches any
    42       * exception, otherwise it points to the
    43       * exception class which is to be caught.
    44       */
    45
    46
    47      /***
    48       * Initialize from another object.
    49       */
    50      public CodeException(CodeException c) {
    51          this(c.getStartPC(), c.getEndPC(), c.getHandlerPC(), c.getCatchType());
    52      }
    53
    54
    55      /***
    56       * Construct object from file stream.
    57       * @param file Input stream
    58       * @throws IOException
    59       */
    60      CodeException(DataInputStream file) throws IOException {
    61          this(file.readUnsignedShort(), file.readUnsignedShort(), file.readUnsignedShort(), file
    62                  .readUnsignedShort());
    63      }
    64
    65
    66      /***
    67       * @param start_pc Range in the code the exception handler is active,
    68       * start_pc is inclusive while
    69       * @param end_pc is exclusive
    70       * @param handler_pc Starting address of exception handler, i.e.,
    71       * an offset from start of code.
    72       * @param catch_type If zero the handler catches any
    73       * exception, otherwise it points to the exception class which is
    74       * to be caught.
    75       */
    76      public CodeException(int start_pc, int end_pc, int handler_pc, int catch_type) {
    77          this.start_pc = start_pc;
    78          this.end_pc = end_pc;
    79          this.handler_pc = handler_pc;
    80          this.catch_type = catch_type;
    81      }
    82
    83
    84      /***
    85       * Called by objects that are traversing the nodes of the tree implicitely
    86       * defined by the contents of a Java class. I.e., the hierarchy of methods,
    87       * fields, attributes, etc. spawns a tree of objects.
    88       *
    89       * @param v Visitor object
    90       */
    91      public void accept( Visitor v ) {
    92          v.visitCodeException(this);
    93      }
    94
    95
    96      /***
    97       * Dump code exception to file stream in binary format.
    98       *
    99       * @param file Output file stream
    100      * @throws IOException
    101      */
    102     public final void dump( DataOutputStream file ) throws IOException {
    103         file.writeShort(start_pc);
    104         file.writeShort(end_pc);
    105         file.writeShort(handler_pc);
    106         file.writeShort(catch_type);
    107     }
    108
    109
    110     /***
    111      * @return 0, if the handler catches any exception, otherwise it points to
    112      * the exception class which is to be caught.
    113      */
    114     public final int getCatchType() {
    115         return catch_type;
    116     }
    117
    118
    119     /***
    120      * @return Exclusive end index of the region where the handler is active.
    121      */
    122     public final int getEndPC() {
    123         return end_pc;
    124     }
    125
    126
    127     /***
    128      * @return Starting address of exception handler, relative to the code.
    129      */
    130     public final int getHandlerPC() {
    131         return handler_pc;
    132     }
    133
    134
    135     /***
    136      * @return Inclusive start index of the region where the handler is active.
    137      */
    138     public final int getStartPC() {
    139         return start_pc;
    140     }
    141
    142
    143     /***
    144      * @param catch_type the type of exception that is caught
    145      */
    146     public final void setCatchType( int catch_type ) {
    147         this.catch_type = catch_type;
    148     }
    149
    150
    151     /***
    152      * @param end_pc end of handled block
    153      */
    154     public final void setEndPC( int end_pc ) {
    155         this.end_pc = end_pc;
    156     }
    157
    158
    159     /***
    160      * @param handler_pc where the actual code is
    161      */
    162     public final void setHandlerPC( int handler_pc ) {
    163         this.handler_pc = handler_pc;
    164     }
    165
    166
    167     /***
    168      * @param start_pc start of handled block
    169      */
    170     public final void setStartPC( int start_pc ) {
    171         this.start_pc = start_pc;
    172     }
    173
    174
    175     /***
    176      * @return String representation.
    177      */
    178     public final String toString() {
    179         return "CodeException(start_pc = " + start_pc + ", end_pc = " + end_pc + ", handler_pc = "
    180                 + handler_pc + ", catch_type = " + catch_type + ")";
    181     }
    182
    183
    184     /***
    185      * @return String representation.
    186      */
    187     public final String toString( ConstantPool cp, boolean verbose ) {
    188         String str;
    189         if (catch_type == 0) {
    190             str = "<Any exception>(0)";
    191         } else {
    192             str = Utility.compactClassName(cp.getConstantString(catch_type, CONSTANT_Class), false)
    193                     + (verbose ? "(" + catch_type + ")" : "");
    194         }
    195         return start_pc + "\t" + end_pc + "\t" + handler_pc + "\t" + str;
    196     }
    197
    198
    199     public final String toString( ConstantPool cp ) {
    200         return toString(cp, true);
    201     }
    202
    203
    204     /***
    205      * @return deep copy of this object
    206      */
    207     public CodeException copy() {
    208         try {
    209             return (CodeException) clone();
    210         } catch (CloneNotSupportedException e) {
    211         }
    212         return null;
    213     }
    214 }