| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/source-position-table.h" | 5 #include "src/source-position-table.h" |
| 6 | 6 |
| 7 #include "src/log.h" | 7 #include "src/log.h" |
| 8 #include "src/objects-inl.h" | 8 #include "src/objects-inl.h" |
| 9 #include "src/objects.h" | 9 #include "src/objects.h" |
| 10 | 10 |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 97 entry->code_offset = tmp; | 97 entry->code_offset = tmp; |
| 98 } else { | 98 } else { |
| 99 entry->is_statement = false; | 99 entry->is_statement = false; |
| 100 entry->code_offset = -(tmp + 1); | 100 entry->code_offset = -(tmp + 1); |
| 101 } | 101 } |
| 102 DecodeInt(bytes, index, &entry->source_position); | 102 DecodeInt(bytes, index, &entry->source_position); |
| 103 } | 103 } |
| 104 | 104 |
| 105 } // namespace | 105 } // namespace |
| 106 | 106 |
| 107 SourcePositionTableBuilder::SourcePositionTableBuilder(Isolate* isolate, | 107 SourcePositionTableBuilder::SourcePositionTableBuilder( |
| 108 Zone* zone) | 108 Isolate* isolate, Zone* zone, |
| 109 SourcePositionTableBuilder::RecordingMode mode) |
| 109 : isolate_(isolate), | 110 : isolate_(isolate), |
| 111 mode_(mode), |
| 110 bytes_(zone), | 112 bytes_(zone), |
| 111 #ifdef ENABLE_SLOW_DCHECKS | 113 #ifdef ENABLE_SLOW_DCHECKS |
| 112 raw_entries_(zone), | 114 raw_entries_(zone), |
| 113 #endif | 115 #endif |
| 114 previous_(), | 116 previous_(), |
| 115 jit_handler_data_(nullptr) { | 117 jit_handler_data_(nullptr) { |
| 118 if (Omit()) return; |
| 116 LOG_CODE_EVENT(isolate_, CodeStartLinePosInfoRecordEvent(&jit_handler_data_)); | 119 LOG_CODE_EVENT(isolate_, CodeStartLinePosInfoRecordEvent(&jit_handler_data_)); |
| 117 } | 120 } |
| 118 | 121 |
| 119 void SourcePositionTableBuilder::EndJitLogging(AbstractCode* code) { | 122 void SourcePositionTableBuilder::EndJitLogging(AbstractCode* code) { |
| 123 if (Omit()) return; |
| 120 LOG_CODE_EVENT(isolate_, | 124 LOG_CODE_EVENT(isolate_, |
| 121 CodeEndLinePosInfoRecordEvent(code, jit_handler_data_)); | 125 CodeEndLinePosInfoRecordEvent(code, jit_handler_data_)); |
| 122 } | 126 } |
| 123 | 127 |
| 124 void SourcePositionTableBuilder::AddPosition(size_t code_offset, | 128 void SourcePositionTableBuilder::AddPosition(size_t code_offset, |
| 125 int source_position, | 129 int source_position, |
| 126 bool is_statement) { | 130 bool is_statement) { |
| 131 if (Omit()) return; |
| 127 int offset = static_cast<int>(code_offset); | 132 int offset = static_cast<int>(code_offset); |
| 128 AddEntry({offset, source_position, is_statement}); | 133 AddEntry({offset, source_position, is_statement}); |
| 129 } | 134 } |
| 130 | 135 |
| 131 void SourcePositionTableBuilder::AddEntry(const PositionTableEntry& entry) { | 136 void SourcePositionTableBuilder::AddEntry(const PositionTableEntry& entry) { |
| 132 PositionTableEntry tmp(entry); | 137 PositionTableEntry tmp(entry); |
| 133 SubtractFromEntry(tmp, previous_); | 138 SubtractFromEntry(tmp, previous_); |
| 134 EncodeEntry(bytes_, tmp); | 139 EncodeEntry(bytes_, tmp); |
| 135 previous_ = entry; | 140 previous_ = entry; |
| 136 | 141 |
| 137 if (entry.is_statement) { | 142 if (entry.is_statement) { |
| 138 LOG_CODE_EVENT(isolate_, CodeLinePosInfoAddStatementPositionEvent( | 143 LOG_CODE_EVENT(isolate_, CodeLinePosInfoAddStatementPositionEvent( |
| 139 jit_handler_data_, entry.code_offset, | 144 jit_handler_data_, entry.code_offset, |
| 140 entry.source_position)); | 145 entry.source_position)); |
| 141 } | 146 } |
| 142 LOG_CODE_EVENT(isolate_, CodeLinePosInfoAddPositionEvent( | 147 LOG_CODE_EVENT(isolate_, CodeLinePosInfoAddPositionEvent( |
| 143 jit_handler_data_, entry.code_offset, | 148 jit_handler_data_, entry.code_offset, |
| 144 entry.source_position)); | 149 entry.source_position)); |
| 145 | 150 |
| 146 #ifdef ENABLE_SLOW_DCHECKS | 151 #ifdef ENABLE_SLOW_DCHECKS |
| 147 raw_entries_.push_back(entry); | 152 raw_entries_.push_back(entry); |
| 148 #endif | 153 #endif |
| 149 } | 154 } |
| 150 | 155 |
| 151 Handle<ByteArray> SourcePositionTableBuilder::ToSourcePositionTable() { | 156 Handle<ByteArray> SourcePositionTableBuilder::ToSourcePositionTable() { |
| 152 if (bytes_.empty()) return isolate_->factory()->empty_byte_array(); | 157 if (bytes_.empty()) return isolate_->factory()->empty_byte_array(); |
| 158 DCHECK(!Omit()); |
| 153 | 159 |
| 154 Handle<ByteArray> table = isolate_->factory()->NewByteArray( | 160 Handle<ByteArray> table = isolate_->factory()->NewByteArray( |
| 155 static_cast<int>(bytes_.size()), TENURED); | 161 static_cast<int>(bytes_.size()), TENURED); |
| 156 | 162 |
| 157 MemCopy(table->GetDataStartAddress(), &*bytes_.begin(), bytes_.size()); | 163 MemCopy(table->GetDataStartAddress(), &*bytes_.begin(), bytes_.size()); |
| 158 | 164 |
| 159 #ifdef ENABLE_SLOW_DCHECKS | 165 #ifdef ENABLE_SLOW_DCHECKS |
| 160 // Brute force testing: Record all positions and decode | 166 // Brute force testing: Record all positions and decode |
| 161 // the entire table to verify they are identical. | 167 // the entire table to verify they are identical. |
| 162 auto raw = raw_entries_.begin(); | 168 auto raw = raw_entries_.begin(); |
| 163 for (SourcePositionTableIterator encoded(*table); !encoded.done(); | 169 for (SourcePositionTableIterator encoded(*table); !encoded.done(); |
| 164 encoded.Advance(), raw++) { | 170 encoded.Advance(), raw++) { |
| 165 DCHECK(raw != raw_entries_.end()); | 171 DCHECK(raw != raw_entries_.end()); |
| 166 DCHECK_EQ(encoded.code_offset(), raw->code_offset); | 172 DCHECK_EQ(encoded.code_offset(), raw->code_offset); |
| 167 DCHECK_EQ(encoded.source_position(), raw->source_position); | 173 DCHECK_EQ(encoded.source_position(), raw->source_position); |
| 168 DCHECK_EQ(encoded.is_statement(), raw->is_statement); | 174 DCHECK_EQ(encoded.is_statement(), raw->is_statement); |
| 169 } | 175 } |
| 170 DCHECK(raw == raw_entries_.end()); | 176 DCHECK(raw == raw_entries_.end()); |
| 177 // No additional source positions after creating the table. |
| 178 mode_ = OMIT_SOURCE_POSITIONS; |
| 171 #endif | 179 #endif |
| 172 | |
| 173 return table; | 180 return table; |
| 174 } | 181 } |
| 175 | 182 |
| 176 SourcePositionTableIterator::SourcePositionTableIterator(ByteArray* byte_array) | 183 SourcePositionTableIterator::SourcePositionTableIterator(ByteArray* byte_array) |
| 177 : table_(byte_array), index_(0), current_() { | 184 : table_(byte_array), index_(0), current_() { |
| 178 Advance(); | 185 Advance(); |
| 179 } | 186 } |
| 180 | 187 |
| 181 void SourcePositionTableIterator::Advance() { | 188 void SourcePositionTableIterator::Advance() { |
| 182 DCHECK(!done()); | 189 DCHECK(!done()); |
| 183 DCHECK(index_ >= 0 && index_ <= table_->length()); | 190 DCHECK(index_ >= 0 && index_ <= table_->length()); |
| 184 if (index_ == table_->length()) { | 191 if (index_ == table_->length()) { |
| 185 index_ = kDone; | 192 index_ = kDone; |
| 186 } else { | 193 } else { |
| 187 PositionTableEntry tmp; | 194 PositionTableEntry tmp; |
| 188 DecodeEntry(table_, &index_, &tmp); | 195 DecodeEntry(table_, &index_, &tmp); |
| 189 AddAndSetEntry(current_, tmp); | 196 AddAndSetEntry(current_, tmp); |
| 190 } | 197 } |
| 191 } | 198 } |
| 192 | 199 |
| 193 } // namespace internal | 200 } // namespace internal |
| 194 } // namespace v8 | 201 } // namespace v8 |
| OLD | NEW |