if (!FORCE_ACCURATE_EXCEPTIONS || AnalysisContext.currentAnalysisContext().getBoolProperty(AnalysisFeatures.ACCURATE_EXCEPTIONS))
if (!(FORCE_ACCURATE_EXCEPTIONS || AnalysisContext.currentAnalysisContext().getBoolProperty(AnalysisFeatures.ACCURATE_EXCEPTIONS)))
	public void endTransfer(BasicBlock basicBlock, InstructionHandle end, Object result)	        throws DataflowAnalysisException {		// Do nothing if we're not computing propagated exceptions		if (!FORCE_ACCURATE_EXCEPTIONS ||				AnalysisContext.currentAnalysisContext().getBoolProperty(AnalysisFeatures.ACCURATE_EXCEPTIONS))			return;		// Also, nothing to do if the block is not an exception thrower		if (!basicBlock.isExceptionThrower())			return;		// If cached results are up to date, don't recompute.		CachedExceptionSet cachedExceptionSet = getCachedExceptionSet(basicBlock);		if (cachedExceptionSet.isUpToDate((TypeFrame) result))			return;		// Figure out what exceptions can be thrown out		// of the basic block, and mark each exception edge		// with the set of exceptions which can be propagated		// along the edge.		// Compute exceptions that can be thrown by the		// basic block.		cachedExceptionSet = computeBlockExceptionSet(basicBlock, (TypeFrame) result);		// For each outgoing exception edge, compute exceptions		// that can be thrown.  This assumes that the exception		// edges are enumerated in decreasing order of priority.		// In the process, this will remove exceptions from		// the thrown exception set.		ExceptionSet thrownExceptionSet = cachedExceptionSet.getExceptionSet().duplicate();		for (Iterator<Edge> i = cfg.outgoingEdgeIterator(basicBlock); i.hasNext();) {			Edge edge = i.next();			if (!edge.isExceptionEdge())				continue;			cachedExceptionSet.setEdgeExceptionSet(edge, computeEdgeExceptionSet(edge, thrownExceptionSet));		}	}