ArrayList<Edge> predEdgeList = new ArrayList<Edge>(); ArrayList<Fact> predFactList = new ArrayList<Fact>();
	public void execute() throws DataflowAnalysisException {		boolean change;		do {			change = false;			++numIterations;				// For each block in CFG...			Iterator<BasicBlock> i = blockOrder.blockIterator();			while (i.hasNext()) {				BasicBlock block = i.next();				if (DEBUG) debug(block, "start\n");					// Get start fact for block.				Fact start = startFactMap.get(block);				analysis.makeFactTop(start);					// Meet all of the logical predecessor results into this block's start.				// Special case: if the block is the logical entry, then it gets				// the special "entry fact".				if (block == logicalEntryBlock()) {					analysis.initEntryFact(start);					if (DEBUG) debug(block, "Init entry fact ==> " + start + "\n");				} else {					Iterator<Edge> predEdgeIter = logicalPredecessorEdgeIterator(block);					ArrayList<Edge> predEdgeList = new ArrayList<Edge>();					ArrayList<Fact> predFactList = new ArrayList<Fact>();					while (predEdgeIter.hasNext()) {						Edge edge = predEdgeIter.next();						predEdgeList.add(edge);						BasicBlock logicalPred = isForwards ? edge.getSource() : edge.getDest();						predFactList.add(resultFactMap.get(logicalPred));					}					analysis.meetPredecessorFacts(block, predEdgeList, predFactList, start);				}				if (DEBUG) debug(block, "start fact is " + start + "\n");					// Get result facts for block,				// making a copy of it (so we can detect if it changed).				Fact result = resultFactMap.get(block);				Fact origResult = analysis.createFact();				analysis.copy(result, origResult);					// Apply the transfer function.				analysis.transfer(block, null, start, result);				if (DEBUG && Boolean.getBoolean("dataflow.blockdebug")) {					debug(block, "Dumping flow values for block:\n");					Iterator<org.apache.bcel.generic.InstructionHandle> ii = block.instructionIterator();					while (ii.hasNext()) {						org.apache.bcel.generic.InstructionHandle handle = ii.next();						Fact tmpResult = analysis.createFact();						analysis.transfer(block, handle, start, tmpResult);						System.out.println("\t" + handle + " " + tmpResult);					}				}					// See if the result changed.				if (!analysis.same(result, origResult)) {					if (DEBUG) debug(block, "result changed!\n");					change = true;				}				if (DEBUG) debug(block, "result is " + result + "\n");			}		} while (change);	}