public DataflowAnalysis<ThisValueFrame> createAnalysis(MethodGen methodGen, CFG cfg) {
public AbstractDataflowAnalysis<ThisValueFrame> createAnalysis(MethodGen methodGen, CFG cfg) {
	public static void main(String[] argv) {		try {			if (argv.length != 1) {				System.out.println("Usage: edu.umd.cs.daveho.ba.ThisValueAnalysis <class file>");				System.exit(1);			}			DataflowTestDriver<ThisValueFrame> driver = new DataflowTestDriver<ThisValueFrame>() {				public DataflowAnalysis<ThisValueFrame> createAnalysis(MethodGen methodGen, CFG cfg) {					return new ThisValueAnalysis(methodGen);				}				public void examineResults(CFG cfg, Dataflow<ThisValueFrame> dataflow) {					Iterator<BasicBlock> i = cfg.blockIterator();					while (i.hasNext()) {						BasicBlock block = i.next();						ThisValueFrame start = dataflow.getStartFact(block);						ThisValueFrame result = dataflow.getResultFact(block);						int numFound = 0;						numFound += count(start);						numFound += count(result);						System.out.println("In block " + block.getId() + " found " + numFound + " occurrences of \"this\" value");					}				}							private int count(ThisValueFrame frame) {					int count = 0;					if (frame.isTop()) {						System.out.println("TOP frame!");						return 0;					}					if (frame.isBottom()) {						System.out.println("BOTTOM frame!");						return 0;					}					int numSlots = frame.getNumSlots();					for (int i = 0; i < numSlots; ++i) {						if (frame.getValue(i).isThis())							++count;					}					return count;				}			};			driver.execute(argv[0]);					} catch (Exception e) {			e.printStackTrace();		}	}