IsNullValueFrame frame = invDataflow.getFactAtLocation(new Location(lastHandle, basicBlock));
IsNullValueFrame frame = invDataflow.getFactAtLocation(location);
	private void analyzeIfNullBranch(Method method, IsNullValueDataflow invDataflow, BasicBlock basicBlock,	                                 InstructionHandle lastHandle) throws DataflowAnalysisException {		IsNullValueFrame frame = invDataflow.getFactAtLocation(new Location(lastHandle, basicBlock));		if (!frame.isValid()) {			// This is probably dead code due to an infeasible exception edge.			return;		}		IsNullValue top = frame.getTopValue();		// Find the line number.		int lineNumber = getLineNumber(method, lastHandle);		if (lineNumber < 0)			return;		if (!(top.isDefinitelyNull() || top.isDefinitelyNotNull())) {			if (DEBUG) System.out.println("Line " + lineNumber + " undetermined");			undeterminedBranchSet.set(lineNumber);			return;		}		// Figure out if the branch is always taken		// or always not taken.		short opcode = lastHandle.getInstruction().getOpcode();		boolean definitelySame = top.isDefinitelyNull();		if (opcode != Constants.IFNULL) definitelySame = !definitelySame;		if (definitelySame) {			if (DEBUG) System.out.println("Line " + lineNumber + " always same");			definitelySameBranchSet.set(lineNumber);		} else {			if (DEBUG) System.out.println("Line " + lineNumber + " always different");			definitelyDifferentBranchSet.set(lineNumber);		}		// Is this a null check made redundant by an earlier check?		// Such code is not as likely to be an error		// as when a check is done after an explicit dereference.		boolean redundantNullCheck = top.isChecked();		RedundantBranch redundantBranch = new RedundantBranch(lastHandle, lineNumber, redundantNullCheck);		if (DEBUG) System.out.println("Adding redundant branch: " + redundantBranch);		redundantBranchList.add(redundantBranch);	}