1 // Copyright 2016 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_INTERPRETER_SOURCE_POSITION_TABLE_H_ 6 #define V8_INTERPRETER_SOURCE_POSITION_TABLE_H_ 7 8 #include "src/assert-scope.h" 9 #include "src/checks.h" 10 #include "src/handles.h" 11 #include "src/log.h" 12 #include "src/zone-containers.h" 13 14 namespace v8 { 15 namespace internal { 16 17 class BytecodeArray; 18 class ByteArray; 19 class Isolate; 20 class Zone; 21 22 namespace interpreter { 23 24 struct PositionTableEntry { PositionTableEntryPositionTableEntry25 PositionTableEntry() 26 : bytecode_offset(0), source_position(0), is_statement(false) {} PositionTableEntryPositionTableEntry27 PositionTableEntry(int bytecode, int source, bool statement) 28 : bytecode_offset(bytecode), 29 source_position(source), 30 is_statement(statement) {} 31 32 int bytecode_offset; 33 int source_position; 34 bool is_statement; 35 }; 36 37 class SourcePositionTableBuilder final : public PositionsRecorder { 38 public: SourcePositionTableBuilder(Isolate * isolate,Zone * zone)39 SourcePositionTableBuilder(Isolate* isolate, Zone* zone) 40 : isolate_(isolate), 41 bytes_(zone), 42 #ifdef ENABLE_SLOW_DCHECKS 43 raw_entries_(zone), 44 #endif 45 previous_() { 46 } 47 48 void AddPosition(size_t bytecode_offset, int source_position, 49 bool is_statement); 50 Handle<ByteArray> ToSourcePositionTable(); 51 52 private: 53 void AddEntry(const PositionTableEntry& entry); 54 void CommitEntry(); 55 56 Isolate* isolate_; 57 ZoneVector<byte> bytes_; 58 #ifdef ENABLE_SLOW_DCHECKS 59 ZoneVector<PositionTableEntry> raw_entries_; 60 #endif 61 PositionTableEntry previous_; // Previously written entry, to compute delta. 62 }; 63 64 class SourcePositionTableIterator { 65 public: 66 explicit SourcePositionTableIterator(ByteArray* byte_array); 67 68 void Advance(); 69 bytecode_offset()70 int bytecode_offset() const { 71 DCHECK(!done()); 72 return current_.bytecode_offset; 73 } source_position()74 int source_position() const { 75 DCHECK(!done()); 76 return current_.source_position; 77 } is_statement()78 bool is_statement() const { 79 DCHECK(!done()); 80 return current_.is_statement; 81 } done()82 bool done() const { return index_ == kDone; } 83 84 private: 85 static const int kDone = -1; 86 87 ByteArray* table_; 88 int index_; 89 PositionTableEntry current_; 90 DisallowHeapAllocation no_gc; 91 }; 92 93 } // namespace interpreter 94 } // namespace internal 95 } // namespace v8 96 97 #endif // V8_INTERPRETER_SOURCE_POSITION_TABLE_H_ 98