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#include "src/compiler/compiler-source-position-table.h"
6#include "src/compiler/graph.h"
7#include "src/compiler/node-aux-data.h"
8
9namespace v8 {
10namespace internal {
11namespace compiler {
12
13class SourcePositionTable::Decorator final : public GraphDecorator {
14 public:
15  explicit Decorator(SourcePositionTable* source_positions)
16      : source_positions_(source_positions) {}
17
18  void Decorate(Node* node) final {
19    source_positions_->SetSourcePosition(node,
20                                         source_positions_->current_position_);
21  }
22
23 private:
24  SourcePositionTable* source_positions_;
25};
26
27SourcePositionTable::SourcePositionTable(Graph* graph)
28    : graph_(graph),
29      decorator_(nullptr),
30      current_position_(SourcePosition::Unknown()),
31      table_(graph->zone()) {}
32
33void SourcePositionTable::AddDecorator() {
34  DCHECK_NULL(decorator_);
35  decorator_ = new (graph_->zone()) Decorator(this);
36  graph_->AddDecorator(decorator_);
37}
38
39void SourcePositionTable::RemoveDecorator() {
40  DCHECK_NOT_NULL(decorator_);
41  graph_->RemoveDecorator(decorator_);
42  decorator_ = nullptr;
43}
44
45SourcePosition SourcePositionTable::GetSourcePosition(Node* node) const {
46  return table_.Get(node);
47}
48
49void SourcePositionTable::SetSourcePosition(Node* node,
50                                            SourcePosition position) {
51  table_.Set(node, position);
52}
53
54void SourcePositionTable::Print(std::ostream& os) const {
55  os << "{";
56  bool needs_comma = false;
57  for (auto i : table_) {
58    SourcePosition pos = i.second;
59    if (pos.IsKnown()) {
60      if (needs_comma) {
61        os << ",";
62      }
63      os << "\"" << i.first << "\""
64         << ":" << pos.ScriptOffset();
65      needs_comma = true;
66    }
67  }
68  os << "}";
69}
70
71}  // namespace compiler
72}  // namespace internal
73}  // namespace v8
74