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 11 namespace v8 { 12 namespace internal { 13 namespace compiler { 14 15 // Encapsulates encoding and decoding of sources positions from which Nodes 16 // originated. 17 class SourcePosition FINAL { 18 public: raw_(raw)19 explicit SourcePosition(int raw = kUnknownPosition) : raw_(raw) {} 20 Unknown()21 static SourcePosition Unknown() { return SourcePosition(kUnknownPosition); } IsUnknown()22 bool IsUnknown() const { return raw() == kUnknownPosition; } 23 Invalid()24 static SourcePosition Invalid() { return SourcePosition(kInvalidPosition); } IsInvalid()25 bool IsInvalid() const { return raw() == kInvalidPosition; } 26 raw()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 37 inline bool operator==(const SourcePosition& lhs, const SourcePosition& rhs) { 38 return lhs.raw() == rhs.raw(); 39 } 40 41 inline bool operator!=(const SourcePosition& lhs, const SourcePosition& rhs) { 42 return !(lhs == rhs); 43 } 44 45 46 class SourcePositionTable FINAL { 47 public: 48 class Scope { 49 public: Scope(SourcePositionTable * source_positions,SourcePosition position)50 Scope(SourcePositionTable* source_positions, SourcePosition position) 51 : source_positions_(source_positions), 52 prev_position_(source_positions->current_position_) { 53 Init(position); 54 } Scope(SourcePositionTable * source_positions,Node * node)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 } ~Scope()60 ~Scope() { source_positions_->current_position_ = prev_position_; } 61 62 private: Init(SourcePosition position)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); ~SourcePositionTable()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