Index: src/compiler/graph.h |
diff --git a/src/compiler/graph.h b/src/compiler/graph.h |
index 5cb7702175d11396b2785bc2c37f6ea11947b815..71fa3e73ed03b4979994ea395923a830992ee20d 100644 |
--- a/src/compiler/graph.h |
+++ b/src/compiler/graph.h |
@@ -19,7 +19,6 @@ namespace compiler { |
class GraphDecorator; |
- |
class Graph : public GenericGraph<Node> { |
public: |
explicit Graph(Zone* zone); |
@@ -78,10 +77,50 @@ class Graph : public GenericGraph<Node> { |
} |
private: |
+ template <typename State> |
+ friend class NodeMarker; |
+ |
+ Mark mark_max_; |
ZoneVector<GraphDecorator*> decorators_; |
}; |
+// A NodeMarker uses monotonically increasing marks to assign local "states" |
+// to nodes. Only one NodeMarker per graph is valid at a given time. |
+template <typename State> |
+class NodeMarker BASE_EMBEDDED { |
+ public: |
+ NodeMarker(Graph* graph, uint32_t num_states) |
+ : mark_min_(graph->mark_max_), mark_max_(graph->mark_max_ += num_states) { |
+ DCHECK(num_states > 0); // user error! |
+ DCHECK(mark_max_ > mark_min_); // check for wraparound. |
+ } |
+ |
+ State Get(Node* node) { |
+ Mark mark = node->mark(); |
+ if (mark < mark_min_) { |
+ mark = mark_min_; |
+ node->set_mark(mark_min_); |
+ } |
+ DCHECK_LT(mark, mark_max_); |
+ return static_cast<State>(mark - mark_min_); |
+ } |
+ |
+ void Set(Node* node, State state) { |
+ Mark local = static_cast<Mark>(state); |
+ DCHECK(local < (mark_max_ - mark_min_)); |
+ DCHECK_LT(node->mark(), mark_max_); |
+ node->set_mark(local + mark_min_); |
+ } |
+ |
+ private: |
+ Mark mark_min_; |
+ Mark mark_max_; |
+}; |
+ |
+ |
+// A graph decorator can be used to add behavior to the creation of nodes |
+// in a graph. |
class GraphDecorator : public ZoneObject { |
public: |
virtual ~GraphDecorator() {} |