// Copyright 2016 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_SOURCE_POSITION_TABLE_H_ #define V8_SOURCE_POSITION_TABLE_H_ #include "src/assert-scope.h" #include "src/checks.h" #include "src/globals.h" #include "src/source-position.h" #include "src/zone/zone-containers.h" namespace v8 { namespace internal { class AbstractCode; class BytecodeArray; class ByteArray; template class Handle; class Isolate; class Zone; struct PositionTableEntry { PositionTableEntry() : code_offset(0), source_position(0), is_statement(false) {} PositionTableEntry(int offset, int64_t source, bool statement) : code_offset(offset), source_position(source), is_statement(statement) {} int code_offset; int64_t source_position; bool is_statement; }; class V8_EXPORT_PRIVATE SourcePositionTableBuilder { public: enum RecordingMode { OMIT_SOURCE_POSITIONS, RECORD_SOURCE_POSITIONS }; SourcePositionTableBuilder(Zone* zone, RecordingMode mode = RECORD_SOURCE_POSITIONS); void AddPosition(size_t code_offset, SourcePosition source_position, bool is_statement); Handle ToSourcePositionTable(Isolate* isolate, Handle code); private: void AddEntry(const PositionTableEntry& entry); inline bool Omit() const { return mode_ == OMIT_SOURCE_POSITIONS; } RecordingMode mode_; ZoneVector bytes_; #ifdef ENABLE_SLOW_DCHECKS ZoneVector raw_entries_; #endif PositionTableEntry previous_; // Previously written entry, to compute delta. }; class V8_EXPORT_PRIVATE SourcePositionTableIterator { public: explicit SourcePositionTableIterator(ByteArray* byte_array); void Advance(); int code_offset() const { DCHECK(!done()); return current_.code_offset; } SourcePosition source_position() const { DCHECK(!done()); return SourcePosition::FromRaw(current_.source_position); } bool is_statement() const { DCHECK(!done()); return current_.is_statement; } bool done() const { return index_ == kDone; } private: static const int kDone = -1; ByteArray* table_; int index_; PositionTableEntry current_; DisallowHeapAllocation no_gc; }; } // namespace internal } // namespace v8 #endif // V8_SOURCE_POSITION_TABLE_H_