// Copyright 2017 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_INTERPRETER_BYTECODE_SOURCE_INFO_H_ #define V8_INTERPRETER_BYTECODE_SOURCE_INFO_H_ #include "src/common/globals.h" namespace v8 { namespace internal { namespace interpreter { // Source code position information. class BytecodeSourceInfo final { public: static const int kUninitializedPosition = -1; BytecodeSourceInfo() : position_type_(PositionType::kNone), source_position_(kUninitializedPosition) {} BytecodeSourceInfo(int source_position, bool is_statement) : position_type_(is_statement ? PositionType::kStatement : PositionType::kExpression), source_position_(source_position) { DCHECK_GE(source_position, 0); } // Makes instance into a statement position. void MakeStatementPosition(int source_position) { // Statement positions can be replaced by other statement // positions. For example , "for (x = 0; x < 3; ++x) 7;" has a // statement position associated with 7 but no bytecode associated // with it. Then Next is emitted after the body and has // statement position and overrides the existing one. position_type_ = PositionType::kStatement; source_position_ = source_position; } // Makes instance into an expression position. Instance should not // be a statement position otherwise it could be lost and impair the // debugging experience. void MakeExpressionPosition(int source_position) { DCHECK(!is_statement()); position_type_ = PositionType::kExpression; source_position_ = source_position; } // Forces an instance into an expression position. void ForceExpressionPosition(int source_position) { position_type_ = PositionType::kExpression; source_position_ = source_position; } int source_position() const { DCHECK(is_valid()); return source_position_; } bool is_statement() const { return position_type_ == PositionType::kStatement; } bool is_expression() const { return position_type_ == PositionType::kExpression; } bool is_valid() const { return position_type_ != PositionType::kNone; } void set_invalid() { position_type_ = PositionType::kNone; source_position_ = kUninitializedPosition; } bool operator==(const BytecodeSourceInfo& other) const { return position_type_ == other.position_type_ && source_position_ == other.source_position_; } bool operator!=(const BytecodeSourceInfo& other) const { return position_type_ != other.position_type_ || source_position_ != other.source_position_; } private: enum class PositionType : uint8_t { kNone, kExpression, kStatement }; PositionType position_type_; int source_position_; }; V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os, const BytecodeSourceInfo& info); } // namespace interpreter } // namespace internal } // namespace v8 #endif // V8_INTERPRETER_BYTECODE_SOURCE_INFO_H_