Location location = new Location(lastInSourceHandle, sourceBlock); ValueNumberFrame prevVnaFrame = vnaDataflow.getFactAtLocation(location);
short lastInSourceOpcode = lastInSourceHandle.getInstruction().getOpcode(); if (nullComparisonInstructionSet.get(lastInSourceOpcode)) {   final Location atIf = new Location(lastInSourceHandle, sourceBlock); final IsNullValueFrame prevIsNullValueFrame = getFactAtLocation(atIf); final ValueNumberFrame prevVnaFrame = vnaDataflow.getFactAtLocation(atIf); final int prevNumSlots = prevIsNullValueFrame.getNumSlots(); final IsNullValue conditionValue = prevIsNullValueFrame.getTopValue();
	public void meetInto(IsNullValueFrame fact, Edge edge, IsNullValueFrame result)		throws DataflowAnalysisException {		if (fact.isValid()) {			IsNullValueFrame tmpFact = null;			final int numSlots = fact.getNumSlots();			if (!NO_SPLIT_DOWNGRADE_NSP) {				// Downgrade NSP to DNR on non-exception control splits				if (!edge.isExceptionEdge() && numNonExceptionSuccessorMap[edge.getSource().getId()] > 1) {					tmpFact = modifyFrame(fact, tmpFact);					for (int i = 0; i < numSlots; ++i) {						IsNullValue value = tmpFact.getValue(i);						if (value.equals(IsNullValue.nullOnSomePathValue()))							tmpFact.setValue(i, IsNullValue.doNotReportValue());					}				}			}			if (!NO_SWITCH_DEFAULT_AS_EXCEPTION) {				if (edge.getType() == SWITCH_DEFAULT_EDGE) {					tmpFact = modifyFrame(fact, tmpFact);					tmpFact.toExceptionValues();				}			}			final BasicBlock destBlock = edge.getTarget();			if (destBlock.isExceptionHandler()) {				// Exception handler - clear stack and push a non-null value				// to represent the exception.				tmpFact = modifyFrame(fact, tmpFact);				tmpFact.clearStack();				// Downgrade NULL and NSP to DNR if the handler is for				// CloneNotSupportedException or InterruptedException				CodeExceptionGen handler = destBlock.getExceptionGen();				ObjectType catchType = handler.getCatchType();				if (catchType != null) {					String catchClass = catchType.getClassName();					if (catchClass.equals("java.lang.CloneNotSupportedException") ||						catchClass.equals("java.lang.InterruptedException")) {						for (int i = 0; i < tmpFact.getNumSlots(); ++i) {							IsNullValue value = tmpFact.getValue(i);							if (value.isDefinitelyNull() || value.isNullOnSomePath())								tmpFact.setValue(i, IsNullValue.doNotReportValue());						}					}				}				// Mark all values as having occurred on an exception path				tmpFact.toExceptionValues();				// Push the exception value				tmpFact.pushValue(IsNullValue.nonNullValue());			} else {				// Determine if the edge conveys any information about the				// null/non-null status of operands in the incoming frame.				final BasicBlock sourceBlock = edge.getSource();				final InstructionHandle lastInSourceHandle = sourceBlock.getLastInstruction();				final int edgeType = edge.getType();				// Handle IFNULL, IFNONNULL, IF_ACMPEQ, and IF_ACMPNE to				// produce flow-sensitive information about whether or not the				// compared value or values were null.				if (lastInSourceHandle != null) {					Location location = new Location(lastInSourceHandle, sourceBlock);					ValueNumberFrame prevVnaFrame = vnaDataflow.getFactAtLocation(location);					IsNullConditionDecision conditionDecision =						checkCondition(location, edgeType, prevVnaFrame);					if (conditionDecision != null) {						// Use the information						tmpFact = replaceValues(fact, tmpFact, conditionDecision.getValue(), prevVnaFrame,							conditionDecision.getDecision());					}				}				// If this is a fall-through edge from a null check,				// then we know the value checked is not null.				if (sourceBlock.isNullCheck() && edgeType == FALL_THROUGH_EDGE) {					ValueNumberFrame vnaFrame = vnaDataflow.getStartFact(destBlock);					if (vnaFrame == null)						throw new IllegalStateException("no vna frame at block entry?");					// For all of the instructions which have a null-checked					// reference operand, it is pushed onto the stack before					// all of the other operands to the instruction.					Instruction firstInDest = edge.getTarget().getFirstInstruction().getInstruction();					int numSlotsConsumed = firstInDest.consumeStack(methodGen.getConstantPool());					if (numSlotsConsumed == Constants.UNPREDICTABLE)						throw new DataflowAnalysisException("Unpredictable stack consumption for " + firstInDest);					ValueNumber replaceMe = vnaFrame.getValue(numSlots - numSlotsConsumed);					tmpFact = replaceValues(fact, tmpFact, replaceMe, vnaFrame, IsNullValue.nonNullValue());				}			}			if (tmpFact != null)				fact = tmpFact;		}		// Normal dataflow merge		result.mergeWith(fact);	}