| // Copyright 2015 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef V8_COMPILER_NODE_MARKER_H_ |
| #define V8_COMPILER_NODE_MARKER_H_ |
| |
| #include "src/base/macros.h" |
| |
| namespace v8 { |
| namespace internal { |
| namespace compiler { |
| |
| // Forward declarations. |
| class Graph; |
| class Node; |
| |
| |
| // Marks are used during traversal of the graph to distinguish states of nodes. |
| // Each node has a mark which is a monotonically increasing integer, and a |
| // {NodeMarker} has a range of values that indicate states of a node. |
| typedef uint32_t Mark; |
| |
| |
| // Base class for templatized NodeMarkers. |
| class NodeMarkerBase { |
| public: |
| NodeMarkerBase(Graph* graph, uint32_t num_states); |
| |
| Mark Get(Node* node); |
| void Set(Node* node, Mark mark); |
| |
| private: |
| Mark mark_min_; |
| Mark mark_max_; |
| |
| DISALLOW_COPY_AND_ASSIGN(NodeMarkerBase); |
| }; |
| |
| |
| // 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 : public NodeMarkerBase { |
| public: |
| NodeMarker(Graph* graph, uint32_t num_states) |
| : NodeMarkerBase(graph, num_states) {} |
| |
| State Get(Node* node) { |
| return static_cast<State>(NodeMarkerBase::Get(node)); |
| } |
| |
| void Set(Node* node, State state) { |
| NodeMarkerBase::Set(node, static_cast<Mark>(state)); |
| } |
| }; |
| |
| } // namespace compiler |
| } // namespace internal |
| } // namespace v8 |
| |
| #endif // V8_COMPILER_NODE_MARKER_H_ |