1 cananian 1.1.2.4 // ReversePostOrderIterator.java, created Tue Jul 27 17:33:06 1999 by duncan
 2 cananian 1.1.2.6 // Copyright (C) 1998 John Whaley <jwhaley@alum.mit.edu>
 3 cananian 1.1.2.3 // Licensed under the terms of the GNU GPL; see COPYING for details.
 4 duncan   1.1.2.1 package harpoon.Analysis.DataFlow;
 5 duncan   1.1.2.1 
 6 duncan   1.1.2.1 /**
 7 duncan   1.1.2.1  * ReversePostOrderIterator
 8 duncan   1.1.2.1  *
 9 cananian 1.1.2.6  * @author  John Whaley <jwhaley@alum.mit.edu>
10 cananian 1.4      * @version $Id: ReversePostOrderIterator.java,v 1.4 2002/04/10 02:59:11 cananian Exp $
11 duncan   1.1.2.1  */
12 duncan   1.1.2.1 
13 pnkfelix 1.1.2.5 import harpoon.Analysis.BasicBlock;
14 duncan   1.1.2.1 import harpoon.Util.EnumerationIterator;
15 duncan   1.1.2.1 import harpoon.Util.Util;
16 duncan   1.1.2.1 
17 duncan   1.1.2.1 import java.util.HashSet;
18 duncan   1.1.2.1 import java.util.Iterator;
19 duncan   1.1.2.1 import java.util.Set;
20 duncan   1.1.2.1 import java.util.Stack;
21 duncan   1.1.2.1 
22 duncan   1.1.2.1 public class ReversePostOrderIterator implements Iterator {
23 duncan   1.1.2.1 
24 duncan   1.1.2.1     public static boolean DEBUG = false;
25 duncan   1.1.2.1     public static void db(String s) { System.out.println(s); }
26 duncan   1.1.2.1     
27 duncan   1.1.2.1     Stack order;
28 duncan   1.1.2.2     
29 duncan   1.1.2.2     public ReversePostOrderIterator(BasicBlock start) {
30 duncan   1.1.2.1         Stack iter_stack = new Stack();
31 duncan   1.1.2.1         Stack bb_stack   = new Stack();
32 duncan   1.1.2.1         order = new Stack();
33 duncan   1.1.2.1         Set done = new HashSet();
34 duncan   1.1.2.1         done.add(start); bb_stack.push(start); 
35 duncan   1.1.2.1         iter_stack.push(new EnumerationIterator(start.next()));
36 duncan   1.1.2.1         while (!bb_stack.isEmpty()) {
37 cananian 1.3.2.1             assert bb_stack.size() == iter_stack.size();
38 duncan   1.1.2.1             for (Iterator i = (Iterator)iter_stack.pop(); i.hasNext();) {
39 duncan   1.1.2.1                 BasicBlock bb2 = (BasicBlock)i.next();
40 duncan   1.1.2.1                 if (!done.contains(bb2)) {
41 duncan   1.1.2.1                     if (DEBUG) db("visiting "+bb2+" for the first time");
42 duncan   1.1.2.1                     done.add(bb2);
43 duncan   1.1.2.1                     bb_stack.push(bb2);
44 duncan   1.1.2.1                     iter_stack.push(i);
45 duncan   1.1.2.1                     i = new EnumerationIterator(bb2.next());
46 duncan   1.1.2.1                 }
47 duncan   1.1.2.1             }
48 duncan   1.1.2.1             Object o = bb_stack.pop();
49 duncan   1.1.2.1             if (DEBUG) db("leaving "+o);
50 duncan   1.1.2.1             order.push(o);
51 duncan   1.1.2.1         }
52 duncan   1.1.2.1     }
53 duncan   1.1.2.1     
54 duncan   1.1.2.1     public boolean hasNext() { 
55 duncan   1.1.2.1         return !order.empty();
56 duncan   1.1.2.1     }
57 duncan   1.1.2.1     
58 duncan   1.1.2.1     public Object next() {
59 duncan   1.1.2.1         return order.pop();
60 duncan   1.1.2.1     }
61 duncan   1.1.2.1 
62 duncan   1.1.2.1     public void remove() { throw new UnsupportedOperationException(); }
63 duncan   1.1.2.1     
64 duncan   1.1.2.1     public ReversePostOrderIterator copy() {
65 duncan   1.1.2.1         ReversePostOrderIterator r = new ReversePostOrderIterator();
66 duncan   1.1.2.1         r.order = (Stack)order.clone();
67 duncan   1.1.2.1         return r;
68 duncan   1.1.2.1     }
69 duncan   1.1.2.1 
70 duncan   1.1.2.1     private ReversePostOrderIterator() {}
71 duncan   1.1.2.1     
72 duncan   1.1.2.1 }
73 duncan   1.1.2.1 
74 duncan   1.1.2.1 
75 duncan   1.1.2.1 
76 cananian 1.2