Index: src/interpreter/source-position-table.h |
diff --git a/src/interpreter/source-position-table.h b/src/interpreter/source-position-table.h |
index 336cf42bc2c1fe00e4205d5f9372539a37a02b7e..17bf724f45f33b479f83ff0f825024bdd35b1434 100644 |
--- a/src/interpreter/source-position-table.h |
+++ b/src/interpreter/source-position-table.h |
@@ -6,72 +6,85 @@ |
#define V8_INTERPRETER_SOURCE_POSITION_TABLE_H_ |
#include "src/assert-scope.h" |
+#include "src/checks.h" |
#include "src/handles.h" |
-#include "src/zone.h" |
#include "src/zone-containers.h" |
namespace v8 { |
namespace internal { |
class BytecodeArray; |
-class FixedArray; |
+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: |
explicit SourcePositionTableBuilder(Isolate* isolate, Zone* zone) |
- : isolate_(isolate), entries_(zone) {} |
+ : isolate_(isolate), |
+ bytes_(zone), |
+#ifdef ENABLE_SLOW_DCHECKS |
+ raw_entries_(zone), |
+#endif |
+ previous_() { |
+ } |
void AddStatementPosition(size_t bytecode_offset, int source_position); |
void AddExpressionPosition(size_t bytecode_offset, int source_position); |
- void RevertPosition(size_t bytecode_offset); |
- Handle<FixedArray> ToFixedArray(); |
+ Handle<ByteArray> ToSourcePositionTable(); |
private: |
- struct Entry { |
- int bytecode_offset; |
- uint32_t source_position_and_type; |
- }; |
- |
- bool CodeOffsetHasPosition(int bytecode_offset) { |
- // Return whether bytecode offset already has a position assigned. |
- return entries_.size() > 0 && |
- entries_.back().bytecode_offset == bytecode_offset; |
- } |
+ void AddEntry(const PositionTableEntry& entry); |
Isolate* isolate_; |
- ZoneVector<Entry> entries_; |
+ ZoneVector<byte> bytes_; |
+#ifdef ENABLE_SLOW_DCHECKS |
+ ZoneVector<PositionTableEntry> raw_entries_; |
+#endif |
+ PositionTableEntry previous_; |
}; |
class SourcePositionTableIterator { |
public: |
- explicit SourcePositionTableIterator(BytecodeArray* bytecode_array); |
+ explicit SourcePositionTableIterator(ByteArray* byte_array); |
void Advance(); |
int bytecode_offset() const { |
DCHECK(!done()); |
- return bytecode_offset_; |
+ return current_.bytecode_offset; |
} |
int source_position() const { |
DCHECK(!done()); |
- return source_position_; |
+ return current_.source_position; |
} |
bool is_statement() const { |
DCHECK(!done()); |
- return is_statement_; |
+ return current_.is_statement; |
} |
- bool done() const { return index_ > length_; } |
+ bool done() const { return index_ == kDone; } |
private: |
- FixedArray* table_; |
+ static const int kDone = -1; |
+ |
+ ByteArray* table_; |
int index_; |
- int length_; |
- bool is_statement_; |
- int bytecode_offset_; |
- int source_position_; |
+ PositionTableEntry current_; |
DisallowHeapAllocation no_gc; |
}; |