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::PrintJson(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.PrintJson(os);
65 needs_comma = true;
66 }
67 }
68 os << "}";
69}
70
71} // namespace compiler
72} // namespace internal
73} // namespace v8
74