1 /* 2 * reserved comment block 3 * DO NOT REMOVE OR ALTER! 4 */ 5 package com.sun.org.apache.bcel.internal.classfile; 6 7 /* ==================================================================== 8 * The Apache Software License, Version 1.1 9 * 10 * Copyright (c) 2001 The Apache Software Foundation. All rights 11 * reserved. 12 * 13 * Redistribution and use in source and binary forms, with or without 14 * modification, are permitted provided that the following conditions 15 * are met: 16 * 17 * 1. Redistributions of source code must retain the above copyright 18 * notice, this list of conditions and the following disclaimer. 19 * 20 * 2. Redistributions in binary form must reproduce the above copyright 21 * notice, this list of conditions and the following disclaimer in 22 * the documentation and/or other materials provided with the 23 * distribution. 24 * 25 * 3. The end-user documentation included with the redistribution, 26 * if any, must include the following acknowledgment: 27 * "This product includes software developed by the 28 * Apache Software Foundation (http://www.apache.org/)." 29 * Alternately, this acknowledgment may appear in the software itself, 30 * if and wherever such third-party acknowledgments normally appear. 31 * 32 * 4. The names "Apache" and "Apache Software Foundation" and 33 * "Apache BCEL" must not be used to endorse or promote products 34 * derived from this software without prior written permission. For 35 * written permission, please contact apache@apache.org. 36 * 37 * 5. Products derived from this software may not be called "Apache", 38 * "Apache BCEL", nor may "Apache" appear in their name, without 39 * prior written permission of the Apache Software Foundation. 40 * 41 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 42 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 43 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 44 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR 45 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 46 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 47 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 48 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 49 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 50 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 51 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 52 * SUCH DAMAGE. 53 * ==================================================================== 54 * 55 * This software consists of voluntary contributions made by many 56 * individuals on behalf of the Apache Software Foundation. For more 57 * information on the Apache Software Foundation, please see 58 * <http://www.apache.org/>. 59 */ 60 61 import com.sun.org.apache.bcel.internal.Constants; 62 import java.io.*; 63 64 /** 65 * This class represents an entry in the exception table of the <em>Code</em> 66 * attribute and is used only there. It contains a range in which a 67 * particular exception handler is active. 68 * 69 * @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A> 70 * @see Code 71 */ 72 public final class CodeException 73 implements Cloneable, Constants, Node, Serializable 74 { 75 private int start_pc; // Range in the code the exception handler is 76 private int end_pc; // active. start_pc is inclusive, end_pc exclusive 77 private int handler_pc; /* Starting address of exception handler, i.e., 78 * an offset from start of code. 79 */ 80 private int catch_type; /* If this is zero the handler catches any 81 * exception, otherwise it points to the 82 * exception class which is to be caught. 83 */ 84 /** 85 * Initialize from another object. 86 */ CodeException(CodeException c)87 public CodeException(CodeException c) { 88 this(c.getStartPC(), c.getEndPC(), c.getHandlerPC(), c.getCatchType()); 89 } 90 91 /** 92 * Construct object from file stream. 93 * @param file Input stream 94 * @throws IOException 95 */ CodeException(DataInputStream file)96 CodeException(DataInputStream file) throws IOException 97 { 98 this(file.readUnsignedShort(), file.readUnsignedShort(), 99 file.readUnsignedShort(), file.readUnsignedShort()); 100 } 101 102 /** 103 * @param start_pc Range in the code the exception handler is active, 104 * start_pc is inclusive while 105 * @param end_pc is exclusive 106 * @param handler_pc Starting address of exception handler, i.e., 107 * an offset from start of code. 108 * @param catch_type If zero the handler catches any 109 * exception, otherwise it points to the exception class which is 110 * to be caught. 111 */ CodeException(int start_pc, int end_pc, int handler_pc, int catch_type)112 public CodeException(int start_pc, int end_pc, int handler_pc, 113 int catch_type) 114 { 115 this.start_pc = start_pc; 116 this.end_pc = end_pc; 117 this.handler_pc = handler_pc; 118 this.catch_type = catch_type; 119 } 120 121 /** 122 * Called by objects that are traversing the nodes of the tree implicitely 123 * defined by the contents of a Java class. I.e., the hierarchy of methods, 124 * fields, attributes, etc. spawns a tree of objects. 125 * 126 * @param v Visitor object 127 */ accept(Visitor v)128 public void accept(Visitor v) { 129 v.visitCodeException(this); 130 } 131 /** 132 * Dump code exception to file stream in binary format. 133 * 134 * @param file Output file stream 135 * @throws IOException 136 */ dump(DataOutputStream file)137 public final void dump(DataOutputStream file) throws IOException 138 { 139 file.writeShort(start_pc); 140 file.writeShort(end_pc); 141 file.writeShort(handler_pc); 142 file.writeShort(catch_type); 143 } 144 145 /** 146 * @return 0, if the handler catches any exception, otherwise it points to 147 * the exception class which is to be caught. 148 */ getCatchType()149 public final int getCatchType() { return catch_type; } 150 151 /** 152 * @return Exclusive end index of the region where the handler is active. 153 */ getEndPC()154 public final int getEndPC() { return end_pc; } 155 156 /** 157 * @return Starting address of exception handler, relative to the code. 158 */ getHandlerPC()159 public final int getHandlerPC() { return handler_pc; } 160 161 /** 162 * @return Inclusive start index of the region where the handler is active. 163 */ getStartPC()164 public final int getStartPC() { return start_pc; } 165 166 /** 167 * @param catch_type. 168 */ setCatchType(int catch_type)169 public final void setCatchType(int catch_type) { 170 this.catch_type = catch_type; 171 } 172 173 /** 174 * @param end_pc end of handled block 175 */ setEndPC(int end_pc)176 public final void setEndPC(int end_pc) { 177 this.end_pc = end_pc; 178 } 179 180 /** 181 * @param handler_pc where the actual code is 182 */ setHandlerPC(int handler_pc)183 public final void setHandlerPC(int handler_pc) { 184 this.handler_pc = handler_pc; 185 } 186 187 /** 188 * @param start_pc start of handled block 189 */ setStartPC(int start_pc)190 public final void setStartPC(int start_pc) { 191 this.start_pc = start_pc; 192 } 193 194 /** 195 * @return String representation. 196 */ toString()197 public final String toString() { 198 return "CodeException(start_pc = " + start_pc + 199 ", end_pc = " + end_pc + 200 ", handler_pc = " + handler_pc + ", catch_type = " + catch_type + ")"; 201 } 202 203 /** 204 * @return String representation. 205 */ toString(ConstantPool cp, boolean verbose)206 public final String toString(ConstantPool cp, boolean verbose) { 207 String str; 208 209 if(catch_type == 0) 210 str = "<Any exception>(0)"; 211 else 212 str = Utility.compactClassName(cp.getConstantString(catch_type, CONSTANT_Class), false) + 213 (verbose? "(" + catch_type + ")" : ""); 214 215 return start_pc + "\t" + end_pc + "\t" + handler_pc + "\t" + str; 216 } 217 toString(ConstantPool cp)218 public final String toString(ConstantPool cp) { 219 return toString(cp, true); 220 } 221 222 /** 223 * @return deep copy of this object 224 */ copy()225 public CodeException copy() { 226 try { 227 return (CodeException)clone(); 228 } catch(CloneNotSupportedException e) {} 229 230 return null; 231 } 232 } 233