source-position.h 2.51 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// Copyright 2014 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef V8_COMPILER_SOURCE_POSITION_H_
#define V8_COMPILER_SOURCE_POSITION_H_

#include "src/assembler.h"
#include "src/compiler/node-aux-data.h"

namespace v8 {
namespace internal {
namespace compiler {

// Encapsulates encoding and decoding of sources positions from which Nodes
// originated.
17
class SourcePosition final {
18 19 20 21 22
 public:
  explicit SourcePosition(int raw = kUnknownPosition) : raw_(raw) {}

  static SourcePosition Unknown() { return SourcePosition(kUnknownPosition); }
  bool IsUnknown() const { return raw() == kUnknownPosition; }
23
  bool IsKnown() const { return raw() != kUnknownPosition; }
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

  int raw() const { return raw_; }

 private:
  static const int kUnknownPosition = RelocInfo::kNoPosition;
  int raw_;
};


inline bool operator==(const SourcePosition& lhs, const SourcePosition& rhs) {
  return lhs.raw() == rhs.raw();
}

inline bool operator!=(const SourcePosition& lhs, const SourcePosition& rhs) {
  return !(lhs == rhs);
}


42
class SourcePositionTable final {
43
 public:
44
  class Scope final {
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
   public:
    Scope(SourcePositionTable* source_positions, SourcePosition position)
        : source_positions_(source_positions),
          prev_position_(source_positions->current_position_) {
      Init(position);
    }
    Scope(SourcePositionTable* source_positions, Node* node)
        : source_positions_(source_positions),
          prev_position_(source_positions->current_position_) {
      Init(source_positions_->GetSourcePosition(node));
    }
    ~Scope() { source_positions_->current_position_ = prev_position_; }

   private:
    void Init(SourcePosition position) {
60
      if (position.IsKnown()) source_positions_->current_position_ = position;
61 62
    }

63 64
    SourcePositionTable* const source_positions_;
    SourcePosition const prev_position_;
65 66 67 68 69
    DISALLOW_COPY_AND_ASSIGN(Scope);
  };

  explicit SourcePositionTable(Graph* graph);
  ~SourcePositionTable() {
70
    if (decorator_) RemoveDecorator();
71 72 73 74 75
  }

  void AddDecorator();
  void RemoveDecorator();

76
  SourcePosition GetSourcePosition(Node* node) const;
77

78 79
  void Print(std::ostream& os) const;

80 81 82
 private:
  class Decorator;

83
  Graph* const graph_;
84 85 86 87 88 89 90 91 92 93 94
  Decorator* decorator_;
  SourcePosition current_position_;
  NodeAuxData<SourcePosition> table_;

  DISALLOW_COPY_AND_ASSIGN(SourcePositionTable);
};

}  // namespace compiler
}  // namespace internal
}  // namespace v8

95
#endif  // V8_COMPILER_SOURCE_POSITION_H_