• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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