summaryrefslogtreecommitdiff
path: root/deps/v8/src/source-position-table.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/source-position-table.h')
-rw-r--r--deps/v8/src/source-position-table.h90
1 files changed, 90 insertions, 0 deletions
diff --git a/deps/v8/src/source-position-table.h b/deps/v8/src/source-position-table.h
new file mode 100644
index 0000000000..76ae4a0759
--- /dev/null
+++ b/deps/v8/src/source-position-table.h
@@ -0,0 +1,90 @@
+// 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/handles.h"
+#include "src/zone-containers.h"
+
+namespace v8 {
+namespace internal {
+
+class AbstractCode;
+class BytecodeArray;
+class ByteArray;
+class Isolate;
+class Zone;
+
+struct PositionTableEntry {
+ PositionTableEntry()
+ : code_offset(0), source_position(0), is_statement(false) {}
+ PositionTableEntry(int offset, int source, bool statement)
+ : code_offset(offset), source_position(source), is_statement(statement) {}
+
+ int code_offset;
+ int source_position;
+ bool is_statement;
+};
+
+class SourcePositionTableBuilder {
+ public:
+ enum RecordingMode { OMIT_SOURCE_POSITIONS, RECORD_SOURCE_POSITIONS };
+
+ SourcePositionTableBuilder(Zone* zone,
+ RecordingMode mode = RECORD_SOURCE_POSITIONS);
+
+ void AddPosition(size_t code_offset, int source_position, bool is_statement);
+
+ Handle<ByteArray> ToSourcePositionTable(Isolate* isolate,
+ Handle<AbstractCode> code);
+
+ private:
+ void AddEntry(const PositionTableEntry& entry);
+
+ inline bool Omit() const { return mode_ == OMIT_SOURCE_POSITIONS; }
+
+ RecordingMode mode_;
+ ZoneVector<byte> bytes_;
+#ifdef ENABLE_SLOW_DCHECKS
+ ZoneVector<PositionTableEntry> raw_entries_;
+#endif
+ PositionTableEntry previous_; // Previously written entry, to compute delta.
+};
+
+class SourcePositionTableIterator {
+ public:
+ explicit SourcePositionTableIterator(ByteArray* byte_array);
+
+ void Advance();
+
+ int code_offset() const {
+ DCHECK(!done());
+ return current_.code_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 internal
+} // namespace v8
+
+#endif // V8_SOURCE_POSITION_TABLE_H_