• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved.
2  *
3  * This program and the accompanying materials are made available under
4  * the terms of the Common Public License v1.0 which accompanies this distribution,
5  * and is available at http://www.eclipse.org/legal/cpl-v10.html
6  *
7  * $Id: Exception_info.java,v 1.1.1.1 2004/05/09 16:57:48 vlad_r Exp $
8  */
9 package com.vladium.jcd.cls.attribute;
10 
11 import java.io.IOException;
12 
13 import com.vladium.jcd.compiler.IClassFormatOutput;
14 import com.vladium.jcd.lib.UDataInputStream;
15 import com.vladium.jcd.lib.UDataOutputStream;
16 
17 // ----------------------------------------------------------------------------
18 /**
19  * An Exception_info is an entry layout format for {@link ExceptionHandlerTable}. Each
20  * entry contains the following items:
21  * <PRE>
22  *    start_pc, end_pc
23  * </PRE>
24  * The values of the two items start_pc and end_pc indicate the ranges in the code
25  * array at which the exception handler is active. The value of start_pc must be
26  * a valid index into the code array of the opcode of an instruction. The value of
27  * end_pc either must be a valid index into the code array of the opcode of an
28  * instruction, or must be equal to code_length , the length of the code array.
29  * The value of start_pc must be less than the value of end_pc.<P>
30  *
31  * The start_pc is inclusive and end_pc is exclusive; that is, the exception handler
32  * must be active while the program counter is within the interval [start_pc, end_pc).
33  * <PRE>
34  *    handler_pc
35  * </PRE>
36  * The value of the handler_pc item indicates the start of the exception handler.
37  * The value of the item must be a valid index into the code array, must be the index
38  * of the opcode of an instruction, and must be less than the value of the code_length
39  * item.
40  * <PRE>
41  *    catch_type
42  * </PRE>
43  * If the value of the catch_type item is nonzero, it must be a valid index into the
44  * constant_pool table. The constant_pool entry at that index must be a
45  * {@link com.vladium.jcd.cls.constant.CONSTANT_Class_info} structure representing
46  * a class of exceptions that this exception handler is designated to catch.
47  * This class must be the class Throwable or one of its subclasses. The exception
48  * handler will be called only if the thrown exception is an instance of the given
49  * class or one of its subclasses.<P>
50  *
51  * If the value of the catch_type item is zero, this exception handler is called for
52  * all exceptions. This is used to implement finally.
53  *
54  * @author (C) 2001, Vlad Roubtsov
55  */
56 public
57 final class Exception_info implements Cloneable, IClassFormatOutput
58 {
59     // public: ................................................................
60 
61 
62     public int m_start_pc, m_end_pc, m_handler_pc, m_catch_type;
63 
64 
Exception_info(final int start_pc, final int end_pc, final int handler_pc, final int catch_type)65     public Exception_info (final int start_pc, final int end_pc,
66                            final int handler_pc, final int catch_type)
67     {
68         m_start_pc = start_pc;
69         m_end_pc = end_pc;
70         m_handler_pc = handler_pc;
71         m_catch_type = catch_type;
72     }
73 
74 
toString()75     public String toString ()
76     {
77         return "exception_info: [start_pc/end_pc = " + m_start_pc + '/' + m_end_pc +
78                ", handler_pc = " + m_handler_pc +
79                ", catch_type = " + m_catch_type + ']';
80     }
81 
82     // Cloneable:
83 
84     /**
85      * Performs a deep copy.
86      */
clone()87     public Object clone ()
88     {
89         try
90         {
91             return super.clone ();
92         }
93         catch (CloneNotSupportedException e)
94         {
95             throw new InternalError (e.toString ());
96         }
97     }
98 
99     // IClassFormatOutput:
100 
writeInClassFormat(final UDataOutputStream out)101     public void writeInClassFormat (final UDataOutputStream out) throws IOException
102     {
103         out.writeU2 (m_start_pc);
104         out.writeU2 (m_end_pc);
105         out.writeU2 (m_handler_pc);
106         out.writeU2 (m_catch_type);
107     }
108 
109     // protected: .............................................................
110 
111     // package: ...............................................................
112 
113 
Exception_info(final UDataInputStream bytes)114     Exception_info (final UDataInputStream bytes) throws IOException
115     {
116         m_start_pc = bytes.readU2 ();
117         m_end_pc = bytes.readU2 ();
118         m_handler_pc = bytes.readU2 ();
119         m_catch_type = bytes.readU2 ();
120     }
121 
122     // private: ...............................................................
123 
124 } // end of class
125 // ----------------------------------------------------------------------------
126