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

Side by Side Diff: src/objects.cc

Issue 2451853002: Uniform and precise source positions for inlining (Closed)
Patch Set: addressed comments Created 4 years, 1 month 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
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 <memory> 9 #include <memory>
10 #include <sstream> 10 #include <sstream>
(...skipping 13352 matching lines...) Expand 10 before | Expand all | Expand 10 after
13363 array->set_map(isolate->heap()->fixed_cow_array_map()); 13363 array->set_map(isolate->heap()->fixed_cow_array_map());
13364 } 13364 }
13365 13365
13366 script->set_line_ends(*array); 13366 script->set_line_ends(*array);
13367 DCHECK(script->line_ends()->IsFixedArray()); 13367 DCHECK(script->line_ends()->IsFixedArray());
13368 } 13368 }
13369 13369
13370 #define SMI_VALUE(x) (Smi::cast(x)->value()) 13370 #define SMI_VALUE(x) (Smi::cast(x)->value())
13371 bool Script::GetPositionInfo(int position, PositionInfo* info, 13371 bool Script::GetPositionInfo(int position, PositionInfo* info,
13372 OffsetFlag offset_flag) { 13372 OffsetFlag offset_flag) {
13373 Handle<Script> script(this); 13373 Script* script = this;
13374 InitLineEnds(script); 13374 if (script->line_ends()->IsUndefined(GetIsolate())) {
13375 Handle<Script> script_handle(script);
13376 InitLineEnds(script_handle);
13377 script = *script_handle;
13378 }
13375 13379
13376 DisallowHeapAllocation no_allocation; 13380 DisallowHeapAllocation no_allocation;
13377 13381
13378 DCHECK(script->line_ends()->IsFixedArray()); 13382 DCHECK(script->line_ends()->IsFixedArray());
13379 FixedArray* ends = FixedArray::cast(script->line_ends()); 13383 FixedArray* ends = FixedArray::cast(script->line_ends());
13380 13384
13381 const int ends_len = ends->length(); 13385 const int ends_len = ends->length();
13382 if (ends_len == 0) return false; 13386 if (ends_len == 0) return false;
13383 13387
13384 // Return early on invalid positions. Negative positions behave as if 0 was 13388 // Return early on invalid positions. Negative positions behave as if 0 was
(...skipping 28 matching lines...) Expand all
13413 DCHECK(SMI_VALUE(ends->get(info->line)) >= position && 13417 DCHECK(SMI_VALUE(ends->get(info->line)) >= position &&
13414 SMI_VALUE(ends->get(info->line - 1)) < position); 13418 SMI_VALUE(ends->get(info->line - 1)) < position);
13415 info->line_start = SMI_VALUE(ends->get(info->line - 1)) + 1; 13419 info->line_start = SMI_VALUE(ends->get(info->line - 1)) + 1;
13416 info->column = position - info->line_start; 13420 info->column = position - info->line_start;
13417 } 13421 }
13418 13422
13419 // Line end is position of the linebreak character. 13423 // Line end is position of the linebreak character.
13420 info->line_end = SMI_VALUE(ends->get(info->line)); 13424 info->line_end = SMI_VALUE(ends->get(info->line));
13421 if (info->line_end > 0) { 13425 if (info->line_end > 0) {
13422 DCHECK(script->source()->IsString()); 13426 DCHECK(script->source()->IsString());
13423 Handle<String> src(String::cast(script->source())); 13427 String* src = String::cast(script->source());
13424 if (src->length() >= info->line_end && 13428 if (src->length() >= info->line_end &&
13425 src->Get(info->line_end - 1) == '\r') { 13429 src->Get(info->line_end - 1) == '\r') {
13426 info->line_end--; 13430 info->line_end--;
13427 } 13431 }
13428 } 13432 }
13429 13433
13430 // Add offsets if requested. 13434 // Add offsets if requested.
13431 if (offset_flag == WITH_OFFSET) { 13435 if (offset_flag == WITH_OFFSET) {
13432 if (info->line == 0) { 13436 if (info->line == 0) {
13433 info->column += script->column_offset(); 13437 info->column += script->column_offset();
(...skipping 798 matching lines...) Expand 10 before | Expand all | Expand 10 after
14232 } 14236 }
14233 } 14237 }
14234 14238
14235 int AbstractCode::SourcePosition(int offset) { 14239 int AbstractCode::SourcePosition(int offset) {
14236 int position = 0; 14240 int position = 0;
14237 // Subtract one because the current PC is one instruction after the call site. 14241 // Subtract one because the current PC is one instruction after the call site.
14238 if (IsCode()) offset--; 14242 if (IsCode()) offset--;
14239 for (SourcePositionTableIterator iterator(source_position_table()); 14243 for (SourcePositionTableIterator iterator(source_position_table());
14240 !iterator.done() && iterator.code_offset() <= offset; 14244 !iterator.done() && iterator.code_offset() <= offset;
14241 iterator.Advance()) { 14245 iterator.Advance()) {
14242 position = iterator.source_position(); 14246 position = iterator.source_position().ScriptOffset();
14243 } 14247 }
14244 return position; 14248 return position;
14245 } 14249 }
14246 14250
14247 int AbstractCode::SourceStatementPosition(int offset) { 14251 int AbstractCode::SourceStatementPosition(int offset) {
14248 // First find the closest position. 14252 // First find the closest position.
14249 int position = SourcePosition(offset); 14253 int position = SourcePosition(offset);
14250 // Now find the closest statement position before the position. 14254 // Now find the closest statement position before the position.
14251 int statement_position = 0; 14255 int statement_position = 0;
14252 for (SourcePositionTableIterator it(source_position_table()); !it.done(); 14256 for (SourcePositionTableIterator it(source_position_table()); !it.done();
14253 it.Advance()) { 14257 it.Advance()) {
14254 if (it.is_statement()) { 14258 if (it.is_statement()) {
14255 int p = it.source_position(); 14259 int p = it.source_position().ScriptOffset();
14256 if (statement_position < p && p <= position) { 14260 if (statement_position < p && p <= position) {
14257 statement_position = p; 14261 statement_position = p;
14258 } 14262 }
14259 } 14263 }
14260 } 14264 }
14261 return statement_position; 14265 return statement_position;
14262 } 14266 }
14263 14267
14264 void JSFunction::ClearTypeFeedbackInfo() { 14268 void JSFunction::ClearTypeFeedbackInfo() {
14265 feedback_vector()->ClearSlots(shared()); 14269 feedback_vector()->ClearSlots(shared());
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
14465 } 14469 }
14466 return NULL; 14470 return NULL;
14467 } 14471 }
14468 14472
14469 14473
14470 void Code::PrintDeoptLocation(FILE* out, Address pc) { 14474 void Code::PrintDeoptLocation(FILE* out, Address pc) {
14471 Deoptimizer::DeoptInfo info = Deoptimizer::GetDeoptInfo(this, pc); 14475 Deoptimizer::DeoptInfo info = Deoptimizer::GetDeoptInfo(this, pc);
14472 class SourcePosition pos = info.position; 14476 class SourcePosition pos = info.position;
14473 if (info.deopt_reason != DeoptimizeReason::kNoReason || !pos.IsUnknown()) { 14477 if (info.deopt_reason != DeoptimizeReason::kNoReason || !pos.IsUnknown()) {
14474 if (FLAG_hydrogen_track_positions) { 14478 if (FLAG_hydrogen_track_positions) {
14475 PrintF(out, " ;;; deoptimize at %d_%d: %s\n", 14479 PrintF(out, " ;;; deoptimize at %d_%d: %s\n", pos.InliningId(),
14476 pos.inlining_id(), pos.position(), 14480 pos.ScriptOffset(), DeoptimizeReasonToString(info.deopt_reason));
14477 DeoptimizeReasonToString(info.deopt_reason));
14478 } else { 14481 } else {
14479 PrintF(out, " ;;; deoptimize at %d: %s\n", pos.raw(), 14482 PrintF(out, " ;;; deoptimize at ");
14480 DeoptimizeReasonToString(info.deopt_reason)); 14483 OFStream outstr(out);
14484 pos.Print(outstr, this);
14485 PrintF(out, ", %s\n", DeoptimizeReasonToString(info.deopt_reason));
14481 } 14486 }
14482 } 14487 }
14483 } 14488 }
14484 14489
14485 14490
14486 bool Code::CanDeoptAt(Address pc) { 14491 bool Code::CanDeoptAt(Address pc) {
14487 DeoptimizationInputData* deopt_data = 14492 DeoptimizationInputData* deopt_data =
14488 DeoptimizationInputData::cast(deoptimization_data()); 14493 DeoptimizationInputData::cast(deoptimization_data());
14489 Address code_start_address = instruction_start(); 14494 Address code_start_address = instruction_start();
14490 for (int i = 0; i < deopt_data->DeoptCount(); i++) { 14495 for (int i = 0; i < deopt_data->DeoptCount(); i++) {
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after
14909 } 14914 }
14910 } 14915 }
14911 } 14916 }
14912 os << "\n"; 14917 os << "\n";
14913 14918
14914 SourcePositionTableIterator it(source_position_table()); 14919 SourcePositionTableIterator it(source_position_table());
14915 if (!it.done()) { 14920 if (!it.done()) {
14916 os << "Source positions:\n pc offset position\n"; 14921 os << "Source positions:\n pc offset position\n";
14917 for (; !it.done(); it.Advance()) { 14922 for (; !it.done(); it.Advance()) {
14918 os << std::setw(10) << it.code_offset() << std::setw(10) 14923 os << std::setw(10) << it.code_offset() << std::setw(10)
14919 << it.source_position() << (it.is_statement() ? " statement" : "") 14924 << it.source_position().ScriptOffset()
14920 << "\n"; 14925 << (it.is_statement() ? " statement" : "") << "\n";
14921 } 14926 }
14922 os << "\n"; 14927 os << "\n";
14923 } 14928 }
14924 14929
14925 if (kind() == FUNCTION) { 14930 if (kind() == FUNCTION) {
14926 DeoptimizationOutputData* data = 14931 DeoptimizationOutputData* data =
14927 DeoptimizationOutputData::cast(this->deoptimization_data()); 14932 DeoptimizationOutputData::cast(this->deoptimization_data());
14928 data->DeoptimizationOutputDataPrint(os); 14933 data->DeoptimizationOutputDataPrint(os);
14929 } else if (kind() == OPTIMIZED_FUNCTION) { 14934 } else if (kind() == OPTIMIZED_FUNCTION) {
14930 DeoptimizationInputData* data = 14935 DeoptimizationInputData* data =
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
15012 os << "Parameter count " << parameter_count() << "\n"; 15017 os << "Parameter count " << parameter_count() << "\n";
15013 os << "Frame size " << frame_size() << "\n"; 15018 os << "Frame size " << frame_size() << "\n";
15014 15019
15015 const uint8_t* base_address = GetFirstBytecodeAddress(); 15020 const uint8_t* base_address = GetFirstBytecodeAddress();
15016 SourcePositionTableIterator source_positions(source_position_table()); 15021 SourcePositionTableIterator source_positions(source_position_table());
15017 15022
15018 interpreter::BytecodeArrayIterator iterator(handle(this)); 15023 interpreter::BytecodeArrayIterator iterator(handle(this));
15019 while (!iterator.done()) { 15024 while (!iterator.done()) {
15020 if (!source_positions.done() && 15025 if (!source_positions.done() &&
15021 iterator.current_offset() == source_positions.code_offset()) { 15026 iterator.current_offset() == source_positions.code_offset()) {
15022 os << std::setw(5) << source_positions.source_position(); 15027 os << std::setw(5) << source_positions.source_position().ScriptOffset();
15023 os << (source_positions.is_statement() ? " S> " : " E> "); 15028 os << (source_positions.is_statement() ? " S> " : " E> ");
15024 source_positions.Advance(); 15029 source_positions.Advance();
15025 } else { 15030 } else {
15026 os << " "; 15031 os << " ";
15027 } 15032 }
15028 const uint8_t* current_address = base_address + iterator.current_offset(); 15033 const uint8_t* current_address = base_address + iterator.current_offset();
15029 os << reinterpret_cast<const void*>(current_address) << " @ " 15034 os << reinterpret_cast<const void*>(current_address) << " @ "
15030 << std::setw(4) << iterator.current_offset() << " : "; 15035 << std::setw(4) << iterator.current_offset() << " : ";
15031 interpreter::BytecodeDecoder::Decode(os, current_address, 15036 interpreter::BytecodeDecoder::Decode(os, current_address,
15032 parameter_count()); 15037 parameter_count());
(...skipping 5189 matching lines...) Expand 10 before | Expand all | Expand 10 after
20222 ns, Accessors::ModuleNamespaceEntryInfo(isolate, name, attr)) 20227 ns, Accessors::ModuleNamespaceEntryInfo(isolate, name, attr))
20223 .Check(); 20228 .Check();
20224 } 20229 }
20225 JSObject::PreventExtensions(ns, THROW_ON_ERROR).ToChecked(); 20230 JSObject::PreventExtensions(ns, THROW_ON_ERROR).ToChecked();
20226 20231
20227 return ns; 20232 return ns;
20228 } 20233 }
20229 20234
20230 } // namespace internal 20235 } // namespace internal
20231 } // namespace v8 20236 } // namespace v8
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('j') | src/source-position.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698