Index: src/compiler/generic-algorithm.h |
diff --git a/src/compiler/generic-algorithm.h b/src/compiler/generic-algorithm.h |
index 4b695c714d851ca93c52e2d7229351dadb80384f..391757ecb8beefa068b528c57240144879ef8f20 100644 |
--- a/src/compiler/generic-algorithm.h |
+++ b/src/compiler/generic-algorithm.h |
@@ -6,7 +6,10 @@ |
#define V8_COMPILER_GENERIC_ALGORITHM_H_ |
#include <stack> |
+#include <vector> |
+#include "src/compiler/graph.h" |
+#include "src/compiler/node.h" |
#include "src/zone-containers.h" |
namespace v8 { |
@@ -18,40 +21,37 @@ class Node; |
// GenericGraphVisit allows visitation of graphs of nodes and edges in pre- and |
// post-order. Visitation uses an explicitly allocated stack rather than the |
-// execution stack to avoid stack overflow. Although GenericGraphVisit is |
-// primarily intended to traverse networks of nodes through their |
-// dependencies and uses, it also can be used to visit any graph-like network |
-// by specifying custom traits. |
+// execution stack to avoid stack overflow. |
class GenericGraphVisit { |
public: |
// struct Visitor { |
- // void Pre(Traits::Node* current); |
- // void Post(Traits::Node* current); |
- // void PreEdge(Traits::Node* from, int index, Traits::Node* to); |
- // void PostEdge(Traits::Node* from, int index, Traits::Node* to); |
+ // void Pre(Node* current); |
+ // void Post(Node* current); |
+ // void PreEdge(Node* from, int index, Node* to); |
+ // void PostEdge(Node* from, int index, Node* to); |
// } |
- template <class Visitor, class Traits, class RootIterator> |
- static void Visit(Graph* graph, Zone* zone, RootIterator root_begin, |
- RootIterator root_end, Visitor* visitor) { |
- typedef typename Traits::Node Node; |
- typedef typename Traits::Iterator Iterator; |
+ template <class Visitor> |
+ static void Visit(Graph* graph, Zone* zone, Node** root_begin, |
+ Node** root_end, Visitor* visitor) { |
+ typedef typename Node::InputEdges::iterator Iterator; |
typedef std::pair<Iterator, Iterator> NodeState; |
typedef std::stack<NodeState, ZoneDeque<NodeState> > NodeStateStack; |
NodeStateStack stack((ZoneDeque<NodeState>(zone))); |
- BoolVector visited(Traits::max_id(graph), false, zone); |
+ BoolVector visited(graph->NodeCount(), false, zone); |
Node* current = *root_begin; |
while (true) { |
DCHECK(current != NULL); |
const int id = current->id(); |
DCHECK(id >= 0); |
- DCHECK(id < Traits::max_id(graph)); // Must be a valid id. |
+ DCHECK(id < graph->NodeCount()); // Must be a valid id. |
bool visit = !GetVisited(&visited, id); |
if (visit) { |
visitor->Pre(current); |
SetVisited(&visited, id); |
} |
- Iterator begin(visit ? Traits::begin(current) : Traits::end(current)); |
- Iterator end(Traits::end(current)); |
+ Iterator begin(visit ? current->input_edges().begin() |
+ : current->input_edges().end()); |
+ Iterator end(current->input_edges().end()); |
stack.push(NodeState(begin, end)); |
Node* post_order_node = current; |
while (true) { |
@@ -67,27 +67,26 @@ class GenericGraphVisit { |
current = *root_begin; |
break; |
} |
- post_order_node = Traits::from(stack.top().first); |
+ post_order_node = (*stack.top().first).from(); |
visit = true; |
} else { |
- visitor->PreEdge(Traits::from(top.first), (*top.first).index(), |
- Traits::to(top.first)); |
- current = Traits::to(top.first); |
+ visitor->PreEdge((*top.first).from(), (*top.first).index(), |
+ (*top.first).to()); |
+ current = (*top.first).to(); |
if (!GetVisited(&visited, current->id())) break; |
} |
top = stack.top(); |
- visitor->PostEdge(Traits::from(top.first), (*top.first).index(), |
- Traits::to(top.first)); |
+ visitor->PostEdge((*top.first).from(), (*top.first).index(), |
+ (*top.first).to()); |
++stack.top().first; |
} |
} |
} |
- template <class Visitor, class Traits> |
- static void Visit(Graph* graph, Zone* zone, typename Traits::Node* current, |
- Visitor* visitor) { |
- typename Traits::Node* array[] = {current}; |
- Visit<Visitor, Traits>(graph, zone, &array[0], &array[1], visitor); |
+ template <class Visitor> |
+ static void Visit(Graph* graph, Zone* zone, Node* current, Visitor* visitor) { |
+ Node* array[] = {current}; |
+ Visit<Visitor>(graph, zone, &array[0], &array[1], visitor); |
} |
struct NullNodeVisitor { |
@@ -111,8 +110,11 @@ class GenericGraphVisit { |
return visited->at(id); |
} |
}; |
-} |
-} |
-} // namespace v8::internal::compiler |
+ |
+typedef GenericGraphVisit::NullNodeVisitor NullNodeVisitor; |
+ |
+} // namespace compiler |
+} // namespace internal |
+} // namespace v8 |
#endif // V8_COMPILER_GENERIC_ALGORITHM_H_ |