Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/objects.cc

Issue 2093613002: Simplify source position calculation. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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/objects.h" 5 #include "src/objects.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 #include <iomanip> 8 #include <iomanip>
9 #include <sstream> 9 #include <sstream>
10 10
(...skipping 13487 matching lines...) Expand 10 before | Expand all | Expand 10 after
13498 } 13498 }
13499 } 13499 }
13500 Assembler::FlushICache(GetIsolate(), instruction_start(), instruction_size()); 13500 Assembler::FlushICache(GetIsolate(), instruction_start(), instruction_size());
13501 } 13501 }
13502 13502
13503 // Locate the source position which is closest to the code offset. This is 13503 // Locate the source position which is closest to the code offset. This is
13504 // using the source position information embedded in the relocation info. 13504 // using the source position information embedded in the relocation info.
13505 // The position returned is relative to the beginning of the script where the 13505 // The position returned is relative to the beginning of the script where the
13506 // source for this function is found. 13506 // source for this function is found.
13507 int Code::SourcePosition(int code_offset) { 13507 int Code::SourcePosition(int code_offset) {
13508 Address pc = instruction_start() + code_offset; 13508 // Subtract one because the current PC is one instruction after the call site.
13509 int distance = kMaxInt; 13509 Address pc = instruction_start() + code_offset - 1;
13510 int position = RelocInfo::kNoPosition; // Initially no position found. 13510 int position = RelocInfo::kNoPosition; // Initially no position found.
13511 // Run through all the relocation info to find the best matching source 13511 // Find the closest position attached to a pc lower or equal to the current.
13512 // position. All the code needs to be considered as the sequence of the 13512 // Note that the pc of reloc infos grow monotonically.
13513 // instructions in the code does not necessarily follow the same order as the 13513 for (RelocIterator it(this, RelocInfo::kPositionMask);
13514 // source. 13514 !it.done() && it.rinfo()->pc() <= pc; it.next()) {
13515 RelocIterator it(this, RelocInfo::kPositionMask); 13515 position = static_cast<int>(it.rinfo()->data());
13516 while (!it.done()) {
13517 // Only look at positions after the current pc.
13518 if (it.rinfo()->pc() < pc) {
13519 // Get position and distance.
13520
13521 int dist = static_cast<int>(pc - it.rinfo()->pc());
13522 int pos = static_cast<int>(it.rinfo()->data());
13523 // If this position is closer than the current candidate or if it has the
13524 // same distance as the current candidate and the position is higher then
13525 // this position is the new candidate.
13526 if ((dist < distance) ||
13527 (dist == distance && pos > position)) {
13528 position = pos;
13529 distance = dist;
13530 }
13531 }
13532 it.next();
13533 } 13516 }
13534 DCHECK(kind() == FUNCTION || (is_optimized_code() && is_turbofanned()) || 13517 DCHECK(kind() == FUNCTION || (is_optimized_code() && is_turbofanned()) ||
13535 is_wasm_code() || position == RelocInfo::kNoPosition); 13518 is_wasm_code() || position == RelocInfo::kNoPosition);
13536 return position; 13519 return position;
13537 } 13520 }
13538 13521
13539 13522
13540 // Same as Code::SourcePosition above except it only looks for statement 13523 // Same as Code::SourcePosition above except it only looks for statement
13541 // positions. 13524 // positions.
13542 int Code::SourceStatementPosition(int code_offset) { 13525 int Code::SourceStatementPosition(int code_offset) {
13543 // First find the position as close as possible using all position 13526 // First find the closest position.
13544 // information.
13545 int position = SourcePosition(code_offset); 13527 int position = SourcePosition(code_offset);
13546 // Now find the closest statement position before the position. 13528 // Now find the closest statement position before the position.
13547 int statement_position = 0; 13529 int statement_position = 0;
13548 RelocIterator it(this, RelocInfo::kPositionMask); 13530 for (RelocIterator it(this, RelocInfo::kPositionMask); !it.done();
13549 while (!it.done()) { 13531 it.next()) {
13550 if (RelocInfo::IsStatementPosition(it.rinfo()->rmode())) { 13532 if (RelocInfo::IsStatementPosition(it.rinfo()->rmode())) {
13551 int p = static_cast<int>(it.rinfo()->data()); 13533 int p = static_cast<int>(it.rinfo()->data());
13552 if (statement_position < p && p <= position) { 13534 if (statement_position < p && p <= position) {
13553 statement_position = p; 13535 statement_position = p;
13554 } 13536 }
13555 } 13537 }
13556 it.next();
13557 } 13538 }
13558 return statement_position; 13539 return statement_position;
13559 } 13540 }
13560 13541
13561 13542
13562 SafepointEntry Code::GetSafepointEntry(Address pc) { 13543 SafepointEntry Code::GetSafepointEntry(Address pc) {
13563 SafepointTable table(this); 13544 SafepointTable table(this);
13564 return table.FindEntry(pc); 13545 return table.FindEntry(pc);
13565 } 13546 }
13566 13547
(...skipping 788 matching lines...) Expand 10 before | Expand all | Expand 10 after
14355 for (interpreter::SourcePositionTableIterator iterator( 14336 for (interpreter::SourcePositionTableIterator iterator(
14356 source_position_table()); 14337 source_position_table());
14357 !iterator.done() && iterator.bytecode_offset() <= offset; 14338 !iterator.done() && iterator.bytecode_offset() <= offset;
14358 iterator.Advance()) { 14339 iterator.Advance()) {
14359 last_position = iterator.source_position(); 14340 last_position = iterator.source_position();
14360 } 14341 }
14361 return last_position; 14342 return last_position;
14362 } 14343 }
14363 14344
14364 int BytecodeArray::SourceStatementPosition(int offset) { 14345 int BytecodeArray::SourceStatementPosition(int offset) {
14365 // First find the position as close as possible using all position 14346 // First find the closest position.
14366 // information.
14367 int position = SourcePosition(offset); 14347 int position = SourcePosition(offset);
14368 // Now find the closest statement position before the position. 14348 // Now find the closest statement position before the position.
14369 int statement_position = 0; 14349 int statement_position = 0;
14370 interpreter::SourcePositionTableIterator iterator(source_position_table()); 14350 for (interpreter::SourcePositionTableIterator it(source_position_table());
14371 while (!iterator.done()) { 14351 !it.done(); it.Advance()) {
14372 if (iterator.is_statement()) { 14352 if (it.is_statement()) {
14373 int p = iterator.source_position(); 14353 int p = it.source_position();
14374 if (statement_position < p && p <= position) { 14354 if (statement_position < p && p <= position) {
14375 statement_position = p; 14355 statement_position = p;
14376 } 14356 }
14377 } 14357 }
14378 iterator.Advance();
14379 } 14358 }
14380 return statement_position; 14359 return statement_position;
14381 } 14360 }
14382 14361
14383 void BytecodeArray::Disassemble(std::ostream& os) { 14362 void BytecodeArray::Disassemble(std::ostream& os) {
14384 os << "Parameter count " << parameter_count() << "\n"; 14363 os << "Parameter count " << parameter_count() << "\n";
14385 os << "Frame size " << frame_size() << "\n"; 14364 os << "Frame size " << frame_size() << "\n";
14386 14365
14387 const uint8_t* base_address = GetFirstBytecodeAddress(); 14366 const uint8_t* base_address = GetFirstBytecodeAddress();
14388 interpreter::SourcePositionTableIterator source_positions( 14367 interpreter::SourcePositionTableIterator source_positions(
(...skipping 4466 matching lines...) Expand 10 before | Expand all | Expand 10 after
18855 } else { 18834 } else {
18856 // Old-style generators. 18835 // Old-style generators.
18857 int offset = continuation(); 18836 int offset = continuation();
18858 CHECK(0 <= offset && offset < function()->code()->instruction_size()); 18837 CHECK(0 <= offset && offset < function()->code()->instruction_size());
18859 return function()->code()->SourcePosition(offset); 18838 return function()->code()->SourcePosition(offset);
18860 } 18839 }
18861 } 18840 }
18862 18841
18863 } // namespace internal 18842 } // namespace internal
18864 } // namespace v8 18843 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698