= SourceLineAnnotation.fromVisitedInstruction(this, handled);
= SourceLineAnnotation.fromVisitedInstruction(this.classContext, this, handled);
	public void visit(Code obj) {		CodeException[] exp = obj.getExceptionTable();		LineNumberTable lineNumbers = obj.getLineNumberTable();		if (exp == null) return;		byte[] code = obj.getCode();		for (int i = 0; i < exp.length; i++) {			int handled = exp[i].getHandlerPC();			int start = exp[i].getStartPC();			int end = exp[i].getEndPC();			int cause = exp[i].getCatchType();			boolean exitInTryBlock = false;			if (DEBUG) {				System.out.println("start = " + start				        + ", end = " + end				        + ", handled = " + handled);			}			for (int j = start; j <= end;) {				int opcode = asUnsignedByte(code[j]);				if (opcode >= IRETURN && opcode <= RETURN				        || opcode >= IFEQ && opcode <= GOTO				        && (opcode != GOTO || j < end)				) {					exitInTryBlock = true;					if (DEBUG)						System.out.println("	exit: " + opcode						        + " in " + getFullyQualifiedMethodName());					break;				}				if (NO_OF_OPERANDS[opcode] < 0) {					exitInTryBlock = true;					break;				}				j += 1 + NO_OF_OPERANDS[opcode];			}			if (exitInTryBlock) {				if (DEBUG) System.out.println("Exit in try block");				continue;			}			if (handled < 5) continue;			String c;			if (cause == 0)				c = "Throwable";			else {				c = Utility.compactClassName(getConstantPool().getConstantString(cause,				        CONSTANT_Class), false);				if (!isChecked(c)) continue;			}			int jumpAtEnd = 0;			if (asUnsignedByte(code[end]) == GOTO) {				jumpAtEnd = getUnsignedShort(code, end + 1);				if (jumpAtEnd < handled) jumpAtEnd = 0;			}			int opcode = asUnsignedByte(code[handled]);			int afterHandler = 0;			if (DEBUG) System.out.println("DE:	opcode is " + opcode + ", " + asUnsignedByte(code[handled + 1]));			boolean drops = false;			boolean startsWithASTORE03 = opcode >= ASTORE_0			        && opcode <= ASTORE_3;			if (startsWithASTORE03			        && asUnsignedByte(code[handled + 1]) == RETURN) {				if (DEBUG) System.out.println("Drop 1");				drops = true;				afterHandler = handled + 1;			}			if (handled + 2 < code.length			        && opcode == ASTORE			        && asUnsignedByte(code[handled + 2]) == RETURN) {				drops = true;				afterHandler = handled + 2;				if (DEBUG) System.out.println("Drop 2");			}			if (handled + 3 < code.length			        && !exitInTryBlock) {				if (DEBUG) System.out.println("DE: checking for jumps");				if (startsWithASTORE03				        && asUnsignedByte(code[handled - 3]) == GOTO) {					int offsetBefore =					        getUnsignedShort(code, handled - 2);					if (DEBUG) System.out.println("offset before = " + offsetBefore);					if (offsetBefore == 4) {						drops = true;						afterHandler = handled + 1;						if (DEBUG) System.out.println("Drop 3");					}				}				if (opcode == ASTORE				        && asUnsignedByte(code[handled - 3]) == GOTO) {					int offsetBefore =					        getUnsignedShort(code, handled - 2);					if (offsetBefore == 5) {						drops = true;						afterHandler = handled + 2;						if (DEBUG) System.out.println("Drop 4");					}				}				if (startsWithASTORE03				        && asUnsignedByte(code[handled + 1]) == GOTO				        && asUnsignedByte(code[handled - 3]) == GOTO) {					int offsetBefore =					        getUnsignedShort(code, handled - 2);					int offsetAfter =					        getUnsignedShort(code, handled + 2);					if (offsetAfter > 0 && offsetAfter + 4 == offsetBefore) {						drops = true;						afterHandler = handled + 4;						if (DEBUG) System.out.println("Drop 5");					}				}				if (opcode == ASTORE				        && asUnsignedByte(code[handled + 2]) == GOTO				        && asUnsignedByte(code[handled - 3]) == GOTO) {					int offsetBefore =					        getUnsignedShort(code, handled - 2);					int offsetAfter =					        getUnsignedShort(code, handled + 3);					if (offsetAfter > 0 && offsetAfter + 5 == offsetBefore) {						drops = true;						afterHandler = handled + 5;						if (DEBUG) System.out.println("Drop 6");					}				}			}			boolean multiLineHandler = false;			if (DEBUG)				System.out.println("afterHandler = " + afterHandler				        + ", handled = " + handled);			if (afterHandler > handled && lineNumbers != null) {				int startHandlerLinenumber = lineNumbers.getSourceLine(handled);				int endHandlerLinenumber				        = getNextExecutableLineNumber(lineNumbers, afterHandler) - 1;				if (DEBUG)					System.out.println("Handler in lines "					        + startHandlerLinenumber					        + "-"					        + endHandlerLinenumber);				if (endHandlerLinenumber > startHandlerLinenumber) {					multiLineHandler = true;					if (DEBUG) System.out.println("Multiline handler");				}			}			if (end - start >= 5 && drops && !c.equals("java.lang.InterruptedException")			        && !c.equals("java.lang.CloneNotSupportedException")) {				int priority = NORMAL_PRIORITY;				if (exitInTryBlock) priority++;				SourceLineAnnotation srcLine				        = SourceLineAnnotation.fromVisitedInstruction(this, handled);				if (srcLine != null && LOOK_IN_SOURCE_TO_FIND_COMMENTED_CATCH_BLOCKS) {					if (catchBlockHasComment(srcLine))						return;					else						priority++;				} else {					// can't look at source					if (lineNumbers == null || multiLineHandler) priority += 2;				}				if (c.equals("java.lang.Error")				        || c.equals("java.lang.Exception")				        || c.equals("java.lang.Throwable")				        || c.equals("java.lang.RuntimeException")) {					priority--;					if (end - start > 30) priority--;				}				if (DEBUG) {					System.out.println("Priority is " + priority);				}				if (priority > LOW_PRIORITY) return;				if (priority < HIGH_PRIORITY) priority = HIGH_PRIORITY;				if (DEBUG) {					System.out.println("reporting warning");				}				String key = (exitInTryBlock ? "mightDrop," : "mightIgnore,") + getFullyQualifiedMethodName() + "," + c;				if (reported.add(key)) {					BugInstance bugInstance = new BugInstance(this, exitInTryBlock ? "DE_MIGHT_DROP" : "DE_MIGHT_IGNORE",					        priority)					        .addClassAndMethod(this);					bugInstance.addSourceLine(srcLine);					bugInstance.addClass(c).describe("CLASS_EXCEPTION");					bugReporter.reportBug(bugInstance);				}			}		}	}