FileDocCategorySizeDatePackage
CodeExceptionGen.javaAPI DocJava SE 6 API7601Tue Jun 10 00:22:18 BST 2008com.sun.org.apache.bcel.internal.generic

CodeExceptionGen

public final class CodeExceptionGen extends Object implements InstructionTargeter, Cloneable, Serializable
This 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.
version
$Id: CodeExceptionGen.java,v 1.1.2.1 2005/07/31 23:45:15 jeffsuttor Exp $
author
M. Dahm
see
MethodGen
see
CodeException
see
InstructionHandle

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.

param
start_pc Start of handled region (inclusive)
param
end_pc End of handled region (inclusive)
param
handler_pc Where handling is done
param
catch_type which exception is handled, null for ANY

    setStartPC(start_pc);
    setEndPC(end_pc);
    setHandlerPC(handler_pc);
    this.catch_type = catch_type;
  
Methods Summary
public java.lang.Objectclone()

    try {
      return super.clone();
    } catch(CloneNotSupportedException e) {
      System.err.println(e);
      return null;
    }
  
public booleancontainsTarget(com.sun.org.apache.bcel.internal.generic.InstructionHandle ih)

return
true, if ih is target of this handler

    return (start_pc == ih) || (end_pc == ih) || (handler_pc == ih);
  
public com.sun.org.apache.bcel.internal.generic.ObjectTypegetCatchType()
Gets the type of the Exception to catch, 'null' for ANY.

 return catch_type; 
public com.sun.org.apache.bcel.internal.classfile.CodeExceptiongetCodeException(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.

param
cp constant pool

    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.InstructionHandlegetEndPC()

return
end of handled region (inclusive)

 return end_pc; 
public com.sun.org.apache.bcel.internal.generic.InstructionHandlegetHandlerPC()

return
start of handler

 return handler_pc; 
public com.sun.org.apache.bcel.internal.generic.InstructionHandlegetStartPC()

return
start of handled region (inclusive)

 return start_pc; 
public voidsetCatchType(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 voidsetEndPC(com.sun.org.apache.bcel.internal.generic.InstructionHandle end_pc)

    BranchInstruction.notifyTarget(this.end_pc, end_pc, this);
    this.end_pc = end_pc;
  
public voidsetHandlerPC(com.sun.org.apache.bcel.internal.generic.InstructionHandle handler_pc)

    BranchInstruction.notifyTarget(this.handler_pc, handler_pc, this);
    this.handler_pc = handler_pc;
  
public voidsetStartPC(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.StringtoString()

    return "CodeExceptionGen(" + start_pc + ", " + end_pc + ", " + handler_pc + ")";
  
public voidupdateTarget(com.sun.org.apache.bcel.internal.generic.InstructionHandle old_ih, com.sun.org.apache.bcel.internal.generic.InstructionHandle new_ih)

param
old_ih old target, either start or end
param
new_ih new target

    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 + "}");