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 9 namespace v8 { 10 namespace internal { 11 namespace compiler { 12 13 class 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 27 SourcePositionTable::SourcePositionTable(Graph* graph) 28 : graph_(graph), 29 decorator_(nullptr), 30 current_position_(SourcePosition::Unknown()), 31 table_(graph->zone()) {} 32 33 void SourcePositionTable::AddDecorator() { 34 DCHECK_NULL(decorator_); 35 decorator_ = new (graph_->zone()) Decorator(this); 36 graph_->AddDecorator(decorator_); 37 } 38 39 void SourcePositionTable::RemoveDecorator() { 40 DCHECK_NOT_NULL(decorator_); 41 graph_->RemoveDecorator(decorator_); 42 decorator_ = nullptr; 43 } 44 45 SourcePosition SourcePositionTable::GetSourcePosition(Node* node) const { 46 return table_.Get(node); 47 } 48 49 void SourcePositionTable::SetSourcePosition(Node* node, 50 SourcePosition position) { 51 table_.Set(node, position); 52 } 53 54 void 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