summaryrefslogtreecommitdiff
path: root/deps/v8/src/interpreter/source-position-table.h
blob: 3ac58d621787939383f8d442f241138e06df05a5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// 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_INTERPRETER_SOURCE_POSITION_TABLE_H_
#define V8_INTERPRETER_SOURCE_POSITION_TABLE_H_

#include "src/assert-scope.h"
#include "src/checks.h"
#include "src/handles.h"
#include "src/log.h"
#include "src/zone-containers.h"

namespace v8 {
namespace internal {

class BytecodeArray;
class ByteArray;
class Isolate;
class Zone;

namespace interpreter {

struct PositionTableEntry {
  PositionTableEntry()
      : bytecode_offset(0), source_position(0), is_statement(false) {}
  PositionTableEntry(int bytecode, int source, bool statement)
      : bytecode_offset(bytecode),
        source_position(source),
        is_statement(statement) {}

  int bytecode_offset;
  int source_position;
  bool is_statement;
};

class SourcePositionTableBuilder : public PositionsRecorder {
 public:
  SourcePositionTableBuilder(Isolate* isolate, Zone* zone)
      : isolate_(isolate),
        bytes_(zone),
#ifdef ENABLE_SLOW_DCHECKS
        raw_entries_(zone),
#endif
        candidate_(kUninitializedCandidateOffset, 0, false) {
  }

  void AddStatementPosition(size_t bytecode_offset, int source_position);
  void AddExpressionPosition(size_t bytecode_offset, int source_position);
  Handle<ByteArray> ToSourcePositionTable();

 private:
  static const int kUninitializedCandidateOffset = -1;

  void AddEntry(const PositionTableEntry& entry);
  void CommitEntry();

  Isolate* isolate_;
  ZoneVector<byte> bytes_;
#ifdef ENABLE_SLOW_DCHECKS
  ZoneVector<PositionTableEntry> raw_entries_;
#endif
  PositionTableEntry candidate_;  // Next entry to be written, if initialized.
  PositionTableEntry previous_;   // Previously written entry, to compute delta.
};

class SourcePositionTableIterator {
 public:
  explicit SourcePositionTableIterator(ByteArray* byte_array);

  void Advance();

  int bytecode_offset() const {
    DCHECK(!done());
    return current_.bytecode_offset;
  }
  int source_position() const {
    DCHECK(!done());
    return 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 interpreter
}  // namespace internal
}  // namespace v8

#endif  // V8_INTERPRETER_SOURCE_POSITION_TABLE_H_