38void AddAndSetEntry(PositionTableEntry* value,
39 const PositionTableEntry& other) {
40 value->code_offset += other.code_offset;
42 value->code_offset >= 0);
43 value->source_position += other.source_position;
45 value->is_statement = other.is_statement;
49void SubtractFromEntry(PositionTableEntry* value,
50 const PositionTableEntry& other) {
51 value->code_offset -= other.code_offset;
52 value->source_position -= other.source_position;
57void EncodeInt(ZoneVector<uint8_t>* bytes, T value) {
58 using unsigned_type = std::make_unsigned_t<T>;
61 value = ((
static_cast<unsigned_type
>(
value) << 1) ^ (value >> kShift));
63 unsigned_type encoded =
static_cast<unsigned_type
>(
value);
66 more = encoded > ValueBits::kMax;
68 MoreBit::encode(more) | ValueBits::encode(encoded & ValueBits::kMask);
69 bytes->push_back(current);
70 encoded >>= ValueBits::kSize;
75void EncodeEntry(ZoneVector<uint8_t>* bytes,
const PositionTableEntry& entry) {
84 entry.is_statement ? entry.code_offset : -entry.code_offset - 1);
85 EncodeInt(bytes, entry.source_position);
90T DecodeInt(base::Vector<const uint8_t> bytes,
int* index) {
96 current = bytes[(*index)++];
97 decoded |=
static_cast<std::make_unsigned_t<T>
>(ValueBits::decode(current))
99 more = MoreBit::decode(current);
100 shift += ValueBits::kSize;
103 decoded = (decoded >> 1) ^ (-(decoded & 1));
107void DecodeEntry(base::Vector<const uint8_t> bytes,
int* index,
108 PositionTableEntry* entry) {
109 int tmp = DecodeInt<int>(bytes, index);
111 entry->is_statement =
true;
112 entry->code_offset =
tmp;
114 entry->is_statement =
false;
115 entry->code_offset = -(tmp + 1);
117 entry->source_position = DecodeInt<int64_t>(bytes, index);
120base::Vector<const uint8_t> VectorFromByteArray(
122 return base::Vector<const uint8_t>(byte_array->begin(), byte_array->length());
125#ifdef ENABLE_SLOW_DCHECKS
126void CheckTableEquals(
const ZoneVector<PositionTableEntry>& raw_entries,
127 SourcePositionTableIterator* encoded) {
130 auto raw = raw_entries.begin();
131 for (; !encoded->done(); encoded->Advance(), raw++) {
132 DCHECK(raw != raw_entries.end());
133 DCHECK_EQ(encoded->code_offset(), raw->code_offset);
134 DCHECK_EQ(encoded->source_position().raw(), raw->source_position);
135 DCHECK_EQ(encoded->is_statement(), raw->is_statement);
137 DCHECK(raw == raw_entries.end());
147#ifdef ENABLE_SLOW_DCHECKS
158 int offset =
static_cast<int>(code_offset);
166 EncodeEntry(&
bytes_, tmp);
168#ifdef ENABLE_SLOW_DCHECKS
169 raw_entries_.push_back(entry);
173template <
typename IsolateT>
176 if (
bytes_.
empty())
return isolate->factory()->empty_trusted_byte_array();
180 isolate->factory()->NewTrustedByteArray(
static_cast<int>(
bytes_.
size()));
183#ifdef ENABLE_SLOW_DCHECKS
189 CheckTableEquals(raw_entries_, &it);
210#ifdef ENABLE_SLOW_DCHECKS
216 CheckTableEquals(raw_entries_, &it);
234 : raw_table_(VectorFromByteArray(byte_array)),
235 iteration_filter_(iteration_filter),
236 function_entry_filter_(function_entry_filter) {
244 iteration_filter_(iteration_filter),
245 function_entry_filter_(function_entry_filter) {
257 iteration_filter_(iteration_filter),
258 function_entry_filter_(function_entry_filter) {
271 bool filter_satisfied =
false;
272 while (!
done() && !filter_satisfied) {
273 if (
index_ >= bytes.length()) {
277 DecodeEntry(bytes, &
index_, &tmp);
SourcePositionTableBuilder(Zone *zone, RecordingMode mode=RECORD_SOURCE_POSITIONS)
PositionTableEntry previous_
base::OwnedVector< uint8_t > ToSourcePositionTableVector()
Handle< TrustedByteArray > ToSourcePositionTable(IsolateT *isolate)
ZoneVector< uint8_t > bytes_
void AddPosition(size_t code_offset, SourcePosition source_position, bool is_statement)
void AddEntry(const PositionTableEntry &entry)
FunctionEntryFilter function_entry_filter_
PositionTableEntry current_
Handle< TrustedByteArray > table_
base::Vector< const uint8_t > raw_table_
SourcePosition source_position() const
IterationFilter iteration_filter_
SourcePositionTableIterator(Handle< TrustedByteArray > byte_array, IterationFilter iteration_filter=kJavaScriptOnly, FunctionEntryFilter function_entry_filter=kSkipFunctionEntry)
bool IsJavaScript() const
RecordWriteMode const mode_
#define EXPORT_TEMPLATE_DEFINE(export)
BitField< T, shift, size, uint8_t > BitField8
OwnedVector< T > OwnedCopyOf(const T *data, size_t size)
constexpr int kFunctionEntryBytecodeOffset
constexpr int kBitsPerByte
Tagged(T object) -> Tagged< T >
void MemCopy(void *dest, const void *src, size_t size)
SourcePositionTable *const table_
#define DCHECK_LE(v1, v2)
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK_GE(v1, v2)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
#define V8_EXPORT_PRIVATE