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