CodeExceptionGenpublic final class CodeExceptionGen extends Object implements InstructionTargeter, CloneableThis class represents an exception handler, i.e., specifies the region where
a handler is active and an instruction where the actual handling is done.
pool as parameters. Opposed to the JVM specification the end of the handled
region is set to be inclusive, i.e. all instructions between start and end
are protected including the start and end instructions (handles) themselves.
The end of the region is automatically mapped to be exclusive when calling
getCodeException(), i.e., there is no difference semantically. |
Fields Summary |
---|
private InstructionHandle | start_pc | private InstructionHandle | end_pc | private InstructionHandle | handler_pc | private ObjectType | catch_type |
Constructors Summary |
---|
public CodeExceptionGen(InstructionHandle start_pc, InstructionHandle end_pc, InstructionHandle handler_pc, ObjectType catch_type)Add an exception handler, i.e., specify region where a handler is active and an
instruction where the actual handling is done.
setStartPC(start_pc);
setEndPC(end_pc);
setHandlerPC(handler_pc);
this.catch_type = catch_type;
|
Methods Summary |
---|
public java.lang.Object | clone()
try {
return super.clone();
} catch(CloneNotSupportedException e) {
System.err.println(e);
return null;
}
| public boolean | containsTarget(com.sun.org.apache.bcel.internal.generic.InstructionHandle ih)
return (start_pc == ih) || (end_pc == ih) || (handler_pc == ih);
| public com.sun.org.apache.bcel.internal.generic.ObjectType | getCatchType()Gets the type of the Exception to catch, 'null' for ANY. return catch_type;
| public com.sun.org.apache.bcel.internal.classfile.CodeException | getCodeException(com.sun.org.apache.bcel.internal.generic.ConstantPoolGen cp)Get CodeException object.
This relies on that the instruction list has already been dumped
to byte code or or that the `setPositions' methods has been
called for the instruction list.
return new CodeException(start_pc.getPosition(),
end_pc.getPosition() + end_pc.getInstruction().getLength(),
handler_pc.getPosition(),
(catch_type == null)? 0 : cp.addClass(catch_type));
| public com.sun.org.apache.bcel.internal.generic.InstructionHandle | getEndPC() return end_pc;
| public com.sun.org.apache.bcel.internal.generic.InstructionHandle | getHandlerPC() return handler_pc;
| public com.sun.org.apache.bcel.internal.generic.InstructionHandle | getStartPC() return start_pc;
| public void | setCatchType(com.sun.org.apache.bcel.internal.generic.ObjectType catch_type)Sets the type of the Exception to catch. Set 'null' for ANY. this.catch_type = catch_type;
| public void | setEndPC(com.sun.org.apache.bcel.internal.generic.InstructionHandle end_pc)
BranchInstruction.notifyTarget(this.end_pc, end_pc, this);
this.end_pc = end_pc;
| public void | setHandlerPC(com.sun.org.apache.bcel.internal.generic.InstructionHandle handler_pc)
BranchInstruction.notifyTarget(this.handler_pc, handler_pc, this);
this.handler_pc = handler_pc;
| public void | setStartPC(com.sun.org.apache.bcel.internal.generic.InstructionHandle start_pc)
BranchInstruction.notifyTarget(this.start_pc, start_pc, this);
this.start_pc = start_pc;
| public java.lang.String | toString()
return "CodeExceptionGen(" + start_pc + ", " + end_pc + ", " + handler_pc + ")";
| public void | updateTarget(com.sun.org.apache.bcel.internal.generic.InstructionHandle old_ih, com.sun.org.apache.bcel.internal.generic.InstructionHandle new_ih)
boolean targeted = false;
if(start_pc == old_ih) {
targeted = true;
setStartPC(new_ih);
}
if(end_pc == old_ih) {
targeted = true;
setEndPC(new_ih);
}
if(handler_pc == old_ih) {
targeted = true;
setHandlerPC(new_ih);
}
if(!targeted)
throw new ClassGenException("Not targeting " + old_ih + ", but {" + start_pc + ", " +
end_pc + ", " + handler_pc + "}");
|
|