/* --- Copyright (c) Chris Rathman 1999. All rights reserved. -----------------
> File: jasper/TryCatch_Collection.java
> Purpose: Try-Catch entries for the Code Collection
> Author: Chris Rathman, 12 June 1999
> Version: 1.00
*/
package jasper;
import java.io.*;
/*=======================================================================
= Class: TryCatch_Collection =
= =
= Desc: collection of try catch regions for the code =
=======================================================================*/
class TryCatch_Collection {
private int count; // number of entries
private TryCatch[] trycatches; // try catch definitions for the code
/*-----------------------------------------------------------------------
- Method: Class Constructor -
- -
- Desc: read in the try catch collection from input stream -
-----------------------------------------------------------------------*/
TryCatch_Collection(DataInputStream ios, Pool_Collection pool) throws IOException {
// get the number of entries
count = ios.readShort();
// get the try catch definitions
trycatches = new TryCatch[count];
for (int i = 0; i < count; i++) trycatches[i] = new TryCatch(ios, pool);
}
/*-----------------------------------------------------------------------
- Method: getLabel -
- -
- Desc: ensure that the region is labelled at begin and end -
-----------------------------------------------------------------------*/
void getLabel(Code_Collection code) {
for (int i = 0; i < count; i++) trycatches[i].getLabel(code);
}
/*-----------------------------------------------------------------------
- Method: jasmin -
- -
- Desc: output the .catch directives to the jasmin file -
-----------------------------------------------------------------------*/
void jasmin(PrintStream out) throws IOException {
for (int i = 0; i < count; i++) trycatches[i].jasmin(out);
}
}
/*=======================================================================
= Class: TryCatch =
= =
= Desc: try catch entry for the code =
=======================================================================*/
class TryCatch {
private Pool_Collection pool;
private int startPC; // start program counter for the try block
private int endPC; // end program counter for the try block
private int handlerPC; // program counter address of the catch handler
private int catchType; // class name of the exception caught (index into constant pool table)
/*-----------------------------------------------------------------------
- Method: Class Constructor -
- -
- Desc: read in the try catch definitions from input stream -
-----------------------------------------------------------------------*/
TryCatch(DataInputStream ios, Pool_Collection pool) throws IOException {
// save off the constant pool table for later use
this.pool = pool;
// get start pc for the try block
startPC = ios.readShort();
// get end pc for the try block
endPC = ios.readShort();
// get catch handler address
handlerPC = ios.readShort();
// get name of the exception being caught (index into constant pool table)
catchType = ios.readShort();
}
/*-----------------------------------------------------------------------
- Method: getLabel -
- -
- Desc: ensure that the region is labelled at begin and end -
-----------------------------------------------------------------------*/
void getLabel(Code_Collection code) {
// ensure label at start of try block
code.setLabel(startPC);
// ensure label at end of try block
code.setLabel(endPC);
// ensure label at the catch handler address
code.setLabel(handlerPC);
}
/*-----------------------------------------------------------------------
- Method: jasmin -
- -
- Desc: output the .catch directive to the jasmin file -
-----------------------------------------------------------------------*/
void jasmin(PrintStream out) throws IOException {
String catchClass = "all";
if (catchType > 0) catchClass = pool.toString(catchType);
out.println(ClassFile.pad(" .catch", ClassFile.SPACER) + catchClass +
" from LABEL0x" + Integer.toHexString(startPC) +
" to LABEL0x" + Integer.toHexString(endPC) +
" using LABEL0x" + Integer.toHexString(handlerPC));
}
}