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..8599b22b4b70645ce8b38667fe346c46aa50ca3f 100644 |
--- a/src/interpreter/source-position-table.h |
+++ b/src/interpreter/source-position-table.h |
@@ -6,43 +6,68 @@ |
#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 { |
+ int bytecode_offset; |
+ int source_position; |
+ bool is_statement; |
+}; |
+ |
+// Helper class for SourcePositionTableBuilder + SourcePositionTableIterator. |
+// Each instance is meant for either encoding or decoding, but not both. |
+class SourcePositionTableCodec { |
Yang
2016/02/17 19:54:51
I expect this to be only used by the builder and t
vogelheim
2016/02/18 13:06:09
I removed it entirely, per your other suggestion.
|
+ public: |
+ SourcePositionTableCodec(); |
+ ~SourcePositionTableCodec(); |
+ |
+ void Encode(ZoneVector<byte>& bytes, PositionTableEntry entry); |
+ void EncodeRevertPosition(ZoneVector<byte>& bytes, int bytecode_offset); |
+ void Decode(const byte* bytes, int* index, PositionTableEntry* entry); |
+ int GetPreviousBytecodeOffset() const { return previous_bytecode_offset_; } |
+ |
+ private: |
+ int previous_bytecode_offset_; |
+ int previous_source_position_; |
+}; |
+ |
class SourcePositionTableBuilder { |
public: |
explicit SourcePositionTableBuilder(Isolate* isolate, Zone* zone) |
- : isolate_(isolate), entries_(zone) {} |
+ : isolate_(isolate), bytes_(zone) {} |
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; |
- }; |
- |
+ void AddEntry(const PositionTableEntry& entry); |
bool CodeOffsetHasPosition(int bytecode_offset) { |
// Return whether bytecode offset already has a position assigned. |
- return entries_.size() > 0 && |
- entries_.back().bytecode_offset == bytecode_offset; |
+ return bytes_.size() > 0 && |
+ codec_.GetPreviousBytecodeOffset() == bytecode_offset; |
} |
Isolate* isolate_; |
- ZoneVector<Entry> entries_; |
+ ZoneVector<byte> bytes_; |
+ SourcePositionTableCodec codec_; |
+ |
+#ifdef ENABLE_SLOW_DCHECKS |
+ std::vector<PositionTableEntry> raw_entries_; |
+#endif |
}; |
class SourcePositionTableIterator { |
@@ -53,25 +78,29 @@ class SourcePositionTableIterator { |
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; |
+ |
+ // Allow access to private constructor to implement the testing functionality. |
+ friend Handle<ByteArray> SourcePositionTableBuilder::ToSourcePositionTable(); |
+ explicit SourcePositionTableIterator(ByteArray* byte_array); |
Yang
2016/02/17 19:54:51
I'd actually be perfectly fine if we changed the p
vogelheim
2016/02/18 13:06:09
Done. I like your version better.
|
+ |
+ ByteArray* table_; |
int index_; |
- int length_; |
- bool is_statement_; |
- int bytecode_offset_; |
- int source_position_; |
+ SourcePositionTableCodec codec_; |
+ PositionTableEntry current_; |
DisallowHeapAllocation no_gc; |
}; |