    View Javadoc
    1   package org.apache.bcel.generic;
    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 org.apache.bcel.classfile.*;
    59
    60  /***
    61   * This class represents an exception handler, i.e., specifies the  region where
    62   * a handler is active and an instruction where the actual handling is done.
    63   * pool as parameters. Opposed to the JVM specification the end of the handled
    64   * region is set to be inclusive, i.e. all instructions between start and end
    65   * are protected including the start and end instructions (handles) themselves.
    66   * The end of the region is automatically mapped to be exclusive when calling
    67   * getCodeException(), i.e., there is no difference semantically.
    68   *
    69   * @version $Id: CodeExceptionGen.java,v 1.2 2002/07/11 19:39:04 mdahm Exp $
    70   * @author  <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
    71   * @see     MethodGen
    72   * @see     CodeException
    73   * @see     InstructionHandle
    74   */
    75  public final class CodeExceptionGen
    76    implements InstructionTargeter, Cloneable, java.io.Serializable {
    77    private InstructionHandle start_pc;
    78    private InstructionHandle end_pc;
    79    private InstructionHandle handler_pc;
    80    private ObjectType        catch_type;
    81
    82    /***
    83     * Add an exception handler, i.e., specify region where a handler is active and an
    84     * instruction where the actual handling is done.
    85     *
    86     * @param start_pc Start of handled region (inclusive)
    87     * @param end_pc End of handled region (inclusive)
    88     * @param handler_pc Where handling is done
    89     * @param catch_type which exception is handled, null for ANY
    90     */
    91    public CodeExceptionGen(InstructionHandle start_pc, InstructionHandle end_pc,
    92  			  InstructionHandle handler_pc, ObjectType catch_type) {
    93      setStartPC(start_pc);
    94      setEndPC(end_pc);
    95      setHandlerPC(handler_pc);
    96      this.catch_type = catch_type;
    97    }
    98
    99    /***
    100    * Get CodeException object.<BR>
    101    *
    102    * This relies on that the instruction list has already been dumped
    103    * to byte code or or that the `setPositions' methods has been
    104    * called for the instruction list.
    105    *
    106    * @param cp constant pool
    107    */
    108   public CodeException getCodeException(ConstantPoolGen cp) {
    109     return new CodeException(start_pc.getPosition(),
    110 			     end_pc.getPosition() + end_pc.getInstruction().getLength(),
    111 			     handler_pc.getPosition(),
    112 			     (catch_type == null)? 0 : cp.addClass(catch_type));
    113   }
    114
    115   /* Set start of handler
    116    * @param start_pc Start of handled region (inclusive)
    117    */
    118   public void setStartPC(InstructionHandle start_pc) {
    119     BranchInstruction.notifyTarget(this.start_pc, start_pc, this);
    120     this.start_pc = start_pc;
    121   }
    122
    123   /* Set end of handler
    124    * @param end_pc End of handled region (inclusive)
    125    */
    126   public void setEndPC(InstructionHandle end_pc) {
    127     BranchInstruction.notifyTarget(this.end_pc, end_pc, this);
    128     this.end_pc = end_pc;
    129   }
    130
    131   /* Set handler code
    132    * @param handler_pc Start of handler
    133    */
    134   public void setHandlerPC(InstructionHandle handler_pc) {
    135     BranchInstruction.notifyTarget(this.handler_pc, handler_pc, this);
    136     this.handler_pc = handler_pc;
    137   }
    138
    139   /***
    140    * @param old_ih old target, either start or end
    141    * @param new_ih new target
    142    */
    143   public void updateTarget(InstructionHandle old_ih, InstructionHandle new_ih) {
    144     boolean targeted = false;
    145
    146     if(start_pc == old_ih) {
    147       targeted = true;
    148       setStartPC(new_ih);
    149     }
    150
    151     if(end_pc == old_ih) {
    152       targeted = true;
    153       setEndPC(new_ih);
    154     }
    155
    156     if(handler_pc == old_ih) {
    157       targeted = true;
    158       setHandlerPC(new_ih);
    159     }
    160
    161     if(!targeted)
    162       throw new ClassGenException("Not targeting " + old_ih + ", but {" + start_pc + ", " +
    163 				  end_pc + ", " + handler_pc + "}");
    164   }
    165
    166   /***
    167    * @return true, if ih is target of this handler
    168    */
    169   public boolean containsTarget(InstructionHandle ih) {
    170     return (start_pc == ih) || (end_pc == ih) || (handler_pc == ih);
    171   }
    172
    173   /*** Sets the type of the Exception to catch. Set 'null' for ANY. */
    174   public void              setCatchType(ObjectType catch_type)        { this.catch_type = catch_type; }
    175   /*** Gets the type of the Exception to catch, 'null' for ANY. */
    176   public ObjectType        getCatchType()                             { return catch_type; }
    177
    178   /*** @return start of handled region (inclusive)
    179    */
    180   public InstructionHandle getStartPC()                               { return start_pc; }
    181
    182   /*** @return end of handled region (inclusive)
    183    */
    184   public InstructionHandle getEndPC()                                 { return end_pc; }
    185
    186   /*** @return start of handler
    187    */
    188   public InstructionHandle getHandlerPC()                             { return handler_pc; }
    189
    190   public String toString() {
    191     return "CodeExceptionGen(" + start_pc + ", " + end_pc + ", " + handler_pc + ")";
    192   }
    193
    194   public Object clone() {
    195     try {
    196       return super.clone();
    197     } catch(CloneNotSupportedException e) {
    198       System.err.println(e);
    199       return null;
    200     }
    201   }
    202 }

This page was automatically generated by Maven