1// Copyright 2014 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_COMPILER_SOURCE_POSITION_H_
6#define V8_COMPILER_SOURCE_POSITION_H_
7
8#include "src/assembler.h"
9#include "src/compiler/node-aux-data.h"
10
11namespace v8 {
12namespace internal {
13namespace compiler {
14
15// Encapsulates encoding and decoding of sources positions from which Nodes
16// originated.
17class SourcePosition FINAL {
18 public:
19  explicit SourcePosition(int raw = kUnknownPosition) : raw_(raw) {}
20
21  static SourcePosition Unknown() { return SourcePosition(kUnknownPosition); }
22  bool IsUnknown() const { return raw() == kUnknownPosition; }
23
24  static SourcePosition Invalid() { return SourcePosition(kInvalidPosition); }
25  bool IsInvalid() const { return raw() == kInvalidPosition; }
26
27  int raw() const { return raw_; }
28
29 private:
30  static const int kInvalidPosition = -2;
31  static const int kUnknownPosition = RelocInfo::kNoPosition;
32  STATIC_ASSERT(kInvalidPosition != kUnknownPosition);
33  int raw_;
34};
35
36
37inline bool operator==(const SourcePosition& lhs, const SourcePosition& rhs) {
38  return lhs.raw() == rhs.raw();
39}
40
41inline bool operator!=(const SourcePosition& lhs, const SourcePosition& rhs) {
42  return !(lhs == rhs);
43}
44
45
46class SourcePositionTable FINAL {
47 public:
48  class Scope {
49   public:
50    Scope(SourcePositionTable* source_positions, SourcePosition position)
51        : source_positions_(source_positions),
52          prev_position_(source_positions->current_position_) {
53      Init(position);
54    }
55    Scope(SourcePositionTable* source_positions, Node* node)
56        : source_positions_(source_positions),
57          prev_position_(source_positions->current_position_) {
58      Init(source_positions_->GetSourcePosition(node));
59    }
60    ~Scope() { source_positions_->current_position_ = prev_position_; }
61
62   private:
63    void Init(SourcePosition position) {
64      if (!position.IsUnknown() || prev_position_.IsInvalid()) {
65        source_positions_->current_position_ = position;
66      }
67    }
68
69    SourcePositionTable* source_positions_;
70    SourcePosition prev_position_;
71    DISALLOW_COPY_AND_ASSIGN(Scope);
72  };
73
74  explicit SourcePositionTable(Graph* graph);
75  ~SourcePositionTable() {
76    if (decorator_ != NULL) RemoveDecorator();
77  }
78
79  void AddDecorator();
80  void RemoveDecorator();
81
82  SourcePosition GetSourcePosition(Node* node);
83
84 private:
85  class Decorator;
86
87  Graph* graph_;
88  Decorator* decorator_;
89  SourcePosition current_position_;
90  NodeAuxData<SourcePosition> table_;
91
92  DISALLOW_COPY_AND_ASSIGN(SourcePositionTable);
93};
94
95}  // namespace compiler
96}  // namespace internal
97}  // namespace v8
98
99#endif
100