public void visitExceptionInfo( Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) { int startPC = Math.max(exceptionInfo.u2startPC, clipStart); int endPC = Math.min(exceptionInfo.u2endPC, clipEnd); int handlerPC = exceptionInfo.u2handlerPC; int catchType = exceptionInfo.u2catchType; // Exclude any subroutine invocations that jump out of the try block, // by adding a try block before (and later on, after) each invocation. for (int offset = startPC; offset < endPC; offset++) { if (branchTargetFinder.isSubroutineInvocation(offset)) { Instruction instruction = InstructionFactory.create(codeAttribute.code, offset); int instructionLength = instruction.length(offset); // Is it a subroutine invocation? if (!exceptionInfo.isApplicable(offset + ((BranchInstruction) instruction).branchOffset)) { if (DEBUG) { System.out.println( " Appending extra exception [" + startPC + " -> " + offset + "] -> " + handlerPC); } // Append a try block that ends before the subroutine invocation. codeAttributeComposer.appendException( new ExceptionInfo(startPC, offset, handlerPC, catchType)); // The next try block will start after the subroutine invocation. startPC = offset + instructionLength; } } } if (DEBUG) { System.out.println( " Appending exception [" + startPC + " -> " + endPC + "] -> " + handlerPC); } // Append the exception. Note that exceptions with empty try blocks // are automatically ignored. codeAttributeComposer.appendException(new ExceptionInfo(startPC, endPC, handlerPC, catchType)); }
public void visitExceptionInfo( Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo) { if (!exceptionInfo.isApplicable(instructionOffset)) { exceptionInfoVisitor.visitExceptionInfo(clazz, method, codeAttribute, exceptionInfo); } }