17d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved. 27d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be 37d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// found in the LICENSE file. 47d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 57d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifndef V8_COMPILER_SOURCE_POSITION_H_ 67d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#define V8_COMPILER_SOURCE_POSITION_H_ 77d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 87d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/assembler.h" 97d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/node-aux-data.h" 107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace v8 { 127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace internal { 137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace compiler { 147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Encapsulates encoding and decoding of sources positions from which Nodes 167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// originated. 17ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass SourcePosition FINAL { 187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org public: 197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org explicit SourcePosition(int raw = kUnknownPosition) : raw_(raw) {} 207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org static SourcePosition Unknown() { return SourcePosition(kUnknownPosition); } 227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org bool IsUnknown() const { return raw() == kUnknownPosition; } 237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org static SourcePosition Invalid() { return SourcePosition(kInvalidPosition); } 257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org bool IsInvalid() const { return raw() == kInvalidPosition; } 267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int raw() const { return raw_; } 287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org private: 307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org static const int kInvalidPosition = -2; 317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org static const int kUnknownPosition = RelocInfo::kNoPosition; 327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org STATIC_ASSERT(kInvalidPosition != kUnknownPosition); 337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int raw_; 347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}; 357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orginline bool operator==(const SourcePosition& lhs, const SourcePosition& rhs) { 387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return lhs.raw() == rhs.raw(); 397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orginline bool operator!=(const SourcePosition& lhs, const SourcePosition& rhs) { 427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return !(lhs == rhs); 437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 46ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass SourcePositionTable FINAL { 477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org public: 487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org class Scope { 497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org public: 507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Scope(SourcePositionTable* source_positions, SourcePosition position) 517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org : source_positions_(source_positions), 527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org prev_position_(source_positions->current_position_) { 537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Init(position); 547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Scope(SourcePositionTable* source_positions, Node* node) 567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org : source_positions_(source_positions), 577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org prev_position_(source_positions->current_position_) { 587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Init(source_positions_->GetSourcePosition(node)); 597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ~Scope() { source_positions_->current_position_ = prev_position_; } 617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org private: 637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org void Init(SourcePosition position) { 647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (!position.IsUnknown() || prev_position_.IsInvalid()) { 657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org source_positions_->current_position_ = position; 667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org SourcePositionTable* source_positions_; 707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org SourcePosition prev_position_; 717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org DISALLOW_COPY_AND_ASSIGN(Scope); 727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org }; 737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org explicit SourcePositionTable(Graph* graph); 757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ~SourcePositionTable() { 767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (decorator_ != NULL) RemoveDecorator(); 777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org void AddDecorator(); 807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org void RemoveDecorator(); 817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org SourcePosition GetSourcePosition(Node* node); 837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org private: 857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org class Decorator; 867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Graph* graph_; 887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Decorator* decorator_; 897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org SourcePosition current_position_; 907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org NodeAuxData<SourcePosition> table_; 917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org DISALLOW_COPY_AND_ASSIGN(SourcePositionTable); 937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}; 947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} // namespace compiler 967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} // namespace internal 977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} // namespace v8 987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif 100