< prev index next >

src/java.xml/share/classes/com/sun/org/apache/bcel/internal/generic/CodeExceptionGen.java

Print this page

        

*** 16,175 **** * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ - package com.sun.org.apache.bcel.internal.generic; ! ! import com.sun.org.apache.bcel.internal.classfile.*; /** * 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. * ! * @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A> * @see MethodGen * @see CodeException * @see InstructionHandle */ ! public final class CodeExceptionGen ! implements InstructionTargeter, Cloneable, java.io.Serializable { private InstructionHandle start_pc; private InstructionHandle end_pc; private InstructionHandle handler_pc; private 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 */ ! public CodeExceptionGen(InstructionHandle start_pc, InstructionHandle end_pc, ! InstructionHandle handler_pc, ObjectType catch_type) { setStartPC(start_pc); setEndPC(end_pc); setHandlerPC(handler_pc); this.catch_type = catch_type; } /** * Get CodeException object.<BR> * ! * 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 */ ! public CodeException getCodeException(ConstantPoolGen cp) { ! return new CodeException(start_pc.getPosition(), ! end_pc.getPosition() + end_pc.getInstruction().getLength(), ! handler_pc.getPosition(), ! (catch_type == null)? 0 : cp.addClass(catch_type)); } /* Set start of handler * @param start_pc Start of handled region (inclusive) */ ! public final void setStartPC(InstructionHandle start_pc) { ! BranchInstruction.notifyTargetChanging(this.start_pc, this); this.start_pc = start_pc; - BranchInstruction.notifyTargetChanged(this.start_pc, this); } /* Set end of handler * @param end_pc End of handled region (inclusive) */ ! public final void setEndPC(InstructionHandle end_pc) { ! BranchInstruction.notifyTargetChanging(this.end_pc, this); this.end_pc = end_pc; - BranchInstruction.notifyTargetChanged(this.end_pc, this); } /* Set handler code * @param handler_pc Start of handler */ ! public final void setHandlerPC(InstructionHandle handler_pc) { ! BranchInstruction.notifyTargetChanging(this.handler_pc, this); this.handler_pc = handler_pc; - BranchInstruction.notifyTargetChanged(this.handler_pc, this); } /** * @param old_ih old target, either start or end * @param new_ih new target */ @Override ! public void updateTarget(InstructionHandle old_ih, 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 + "}"); } /** * @return true, if ih is target of this handler */ @Override ! public boolean containsTarget(InstructionHandle ih) { return (start_pc == ih) || (end_pc == ih) || (handler_pc == ih); } ! /** Sets the type of the Exception to catch. Set 'null' for ANY. */ ! public void setCatchType(ObjectType catch_type) { this.catch_type = catch_type; } ! /** Gets the type of the Exception to catch, 'null' for ANY. */ ! public ObjectType getCatchType() { return catch_type; } ! /** @return start of handled region (inclusive) */ ! public InstructionHandle getStartPC() { return start_pc; } ! /** @return end of handled region (inclusive) */ ! public InstructionHandle getEndPC() { return end_pc; } ! /** @return start of handler */ ! public InstructionHandle getHandlerPC() { return handler_pc; } @Override public String toString() { return "CodeExceptionGen(" + start_pc + ", " + end_pc + ", " + handler_pc + ")"; } @Override public Object clone() { try { return super.clone(); ! } catch(CloneNotSupportedException e) { ! System.err.println(e); ! return null; } } } --- 16,186 ---- * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.sun.org.apache.bcel.internal.generic; ! import com.sun.org.apache.bcel.internal.classfile.CodeException; /** * 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 1749603 2016-06-21 20:50:19Z ggregory $ * @see MethodGen * @see CodeException * @see InstructionHandle */ ! public final class CodeExceptionGen implements InstructionTargeter, Cloneable { ! private InstructionHandle start_pc; private InstructionHandle end_pc; private InstructionHandle handler_pc; private 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 */ ! public CodeExceptionGen(final InstructionHandle start_pc, final InstructionHandle end_pc, ! final InstructionHandle handler_pc, final ObjectType catch_type) { setStartPC(start_pc); setEndPC(end_pc); setHandlerPC(handler_pc); this.catch_type = catch_type; } /** * Get CodeException object.<BR> * ! * 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 */ ! public CodeException getCodeException(final ConstantPoolGen cp) { ! return new CodeException(start_pc.getPosition(), end_pc.getPosition() ! + end_pc.getInstruction().getLength(), handler_pc.getPosition(), ! (catch_type == null) ? 0 : cp.addClass(catch_type)); } + /* Set start of handler * @param start_pc Start of handled region (inclusive) */ ! public void setStartPC(final InstructionHandle start_pc) { // TODO could be package-protected? ! BranchInstruction.notifyTarget(this.start_pc, start_pc, this); this.start_pc = start_pc; } + /* Set end of handler * @param end_pc End of handled region (inclusive) */ ! public void setEndPC(final InstructionHandle end_pc) { // TODO could be package-protected? ! BranchInstruction.notifyTarget(this.end_pc, end_pc, this); this.end_pc = end_pc; } + /* Set handler code * @param handler_pc Start of handler */ ! public void setHandlerPC(final InstructionHandle handler_pc) { // TODO could be package-protected? ! BranchInstruction.notifyTarget(this.handler_pc, handler_pc, this); this.handler_pc = handler_pc; } /** * @param old_ih old target, either start or end * @param new_ih new target */ @Override ! public void updateTarget(final InstructionHandle old_ih, final 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 + "}"); ! } } /** * @return true, if ih is target of this handler */ @Override ! public boolean containsTarget(final InstructionHandle ih) { return (start_pc == ih) || (end_pc == ih) || (handler_pc == ih); } ! /** ! * Sets the type of the Exception to catch. Set 'null' for ANY. ! */ ! public void setCatchType(final ObjectType catch_type) { ! this.catch_type = catch_type; ! } ! ! /** ! * Gets the type of the Exception to catch, 'null' for ANY. ! */ ! public ObjectType getCatchType() { ! return catch_type; ! } ! /** ! * @return start of handled region (inclusive) */ ! public InstructionHandle getStartPC() { ! return start_pc; ! } ! /** ! * @return end of handled region (inclusive) */ ! public InstructionHandle getEndPC() { ! return end_pc; ! } ! /** ! * @return start of handler */ ! public InstructionHandle getHandlerPC() { ! return handler_pc; ! } @Override public String toString() { return "CodeExceptionGen(" + start_pc + ", " + end_pc + ", " + handler_pc + ")"; } @Override public Object clone() { try { return super.clone(); ! } catch (final CloneNotSupportedException e) { ! throw new Error("Clone Not Supported"); // never happens } } }
< prev index next >