blob: cc9872e2b93b91c9e3aec3bf2bfa16133544d17e [file] [log] [blame]
/* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved.
*
* This program and the accompanying materials are made available under
* the terms of the Common Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/cpl-v10.html
*
* $Id: Exception_info.java,v 1.1.1.1 2004/05/09 16:57:48 vlad_r Exp $
*/
package com.vladium.jcd.cls.attribute;
import java.io.IOException;
import com.vladium.jcd.compiler.IClassFormatOutput;
import com.vladium.jcd.lib.UDataInputStream;
import com.vladium.jcd.lib.UDataOutputStream;
// ----------------------------------------------------------------------------
/**
* An Exception_info is an entry layout format for {@link ExceptionHandlerTable}. Each
* entry contains the following items:
* <PRE>
* start_pc, end_pc
* </PRE>
* The values of the two items start_pc and end_pc indicate the ranges in the code
* array at which the exception handler is active. The value of start_pc must be
* a valid index into the code array of the opcode of an instruction. The value of
* end_pc either must be a valid index into the code array of the opcode of an
* instruction, or must be equal to code_length , the length of the code array.
* The value of start_pc must be less than the value of end_pc.<P>
*
* The start_pc is inclusive and end_pc is exclusive; that is, the exception handler
* must be active while the program counter is within the interval [start_pc, end_pc).
* <PRE>
* handler_pc
* </PRE>
* The value of the handler_pc item indicates the start of the exception handler.
* The value of the item must be a valid index into the code array, must be the index
* of the opcode of an instruction, and must be less than the value of the code_length
* item.
* <PRE>
* catch_type
* </PRE>
* If the value of the catch_type item is nonzero, it must be a valid index into the
* constant_pool table. The constant_pool entry at that index must be a
* {@link com.vladium.jcd.cls.constant.CONSTANT_Class_info} structure representing
* a class of exceptions that this exception handler is designated to catch.
* This class must be the class Throwable or one of its subclasses. The exception
* handler will be called only if the thrown exception is an instance of the given
* class or one of its subclasses.<P>
*
* If the value of the catch_type item is zero, this exception handler is called for
* all exceptions. This is used to implement finally.
*
* @author (C) 2001, Vlad Roubtsov
*/
public
final class Exception_info implements Cloneable, IClassFormatOutput
{
// public: ................................................................
public int m_start_pc, m_end_pc, m_handler_pc, m_catch_type;
public Exception_info (final int start_pc, final int end_pc,
final int handler_pc, final int catch_type)
{
m_start_pc = start_pc;
m_end_pc = end_pc;
m_handler_pc = handler_pc;
m_catch_type = catch_type;
}
public String toString ()
{
return "exception_info: [start_pc/end_pc = " + m_start_pc + '/' + m_end_pc +
", handler_pc = " + m_handler_pc +
", catch_type = " + m_catch_type + ']';
}
// Cloneable:
/**
* Performs a deep copy.
*/
public Object clone ()
{
try
{
return super.clone ();
}
catch (CloneNotSupportedException e)
{
throw new InternalError (e.toString ());
}
}
// IClassFormatOutput:
public void writeInClassFormat (final UDataOutputStream out) throws IOException
{
out.writeU2 (m_start_pc);
out.writeU2 (m_end_pc);
out.writeU2 (m_handler_pc);
out.writeU2 (m_catch_type);
}
// protected: .............................................................
// package: ...............................................................
Exception_info (final UDataInputStream bytes) throws IOException
{
m_start_pc = bytes.readU2 ();
m_end_pc = bytes.readU2 ();
m_handler_pc = bytes.readU2 ();
m_catch_type = bytes.readU2 ();
}
// private: ...............................................................
} // end of class
// ----------------------------------------------------------------------------