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

Unified Diff: src/debug/debug.cc

Issue 1618343002: [interpreter, debugger] abstraction for source position calculation. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 11 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/debug/debug.h ('k') | src/frames.h » ('j') | src/frames.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/debug/debug.cc
diff --git a/src/debug/debug.cc b/src/debug/debug.cc
index 347d9b6b6d668b3fcea88460947a4755a4269fd8..5b994f617c51452aaf16efd4bc765cd464415649 100644
--- a/src/debug/debug.cc
+++ b/src/debug/debug.cc
@@ -62,7 +62,7 @@ static v8::Local<v8::Context> GetDebugEventContext(Isolate* isolate) {
BreakLocation::BreakLocation(Handle<DebugInfo> debug_info, RelocInfo* rinfo,
int position, int statement_position)
: debug_info_(debug_info),
- pc_offset_(static_cast<int>(rinfo->pc() - debug_info->code()->entry())),
+ code_offset_(static_cast<int>(rinfo->pc() - debug_info->code()->entry())),
rmode_(rinfo->rmode()),
data_(rinfo->data()),
position_(position),
@@ -144,20 +144,29 @@ void BreakLocation::Iterator::Next() {
// Find the break point at the supplied address, or the closest one before
// the address.
-BreakLocation BreakLocation::FromAddress(Handle<DebugInfo> debug_info,
- Address pc) {
+BreakLocation BreakLocation::FromCodeOffset(Handle<DebugInfo> debug_info,
+ int offset) {
Iterator it(debug_info, ALL_BREAK_LOCATIONS);
- it.SkipTo(BreakIndexFromAddress(debug_info, pc));
+ it.SkipTo(BreakIndexFromCodeOffset(debug_info, offset));
return it.GetBreakLocation();
}
+BreakLocation BreakLocation::FromFrame(Handle<DebugInfo> debug_info,
+ JavaScriptFrame* frame) {
+ // Code offset to the instruction after the current one, possibly a break
+ // location as well. So the "- 1" to exclude it from the search.
+ Code* code = frame->LookupCode();
+ int code_offset = frame->pc() - code->instruction_start();
+ return FromCodeOffset(debug_info, code_offset - 1);
+}
+
+
// Find the break point at the supplied address, or the closest one before
// the address.
-void BreakLocation::FromAddressSameStatement(Handle<DebugInfo> debug_info,
- Address pc,
- List<BreakLocation>* result_out) {
- int break_index = BreakIndexFromAddress(debug_info, pc);
+void BreakLocation::FromCodeOffsetSameStatement(
+ Handle<DebugInfo> debug_info, int offset, List<BreakLocation>* result_out) {
+ int break_index = BreakIndexFromCodeOffset(debug_info, offset);
Iterator it(debug_info, ALL_BREAK_LOCATIONS);
it.SkipTo(break_index);
int statement_position = it.statement_position();
@@ -168,11 +177,14 @@ void BreakLocation::FromAddressSameStatement(Handle<DebugInfo> debug_info,
}
-int BreakLocation::BreakIndexFromAddress(Handle<DebugInfo> debug_info,
- Address pc) {
+int BreakLocation::BreakIndexFromCodeOffset(Handle<DebugInfo> debug_info,
+ int offset) {
// Run through all break points to locate the one closest to the address.
int closest_break = 0;
int distance = kMaxInt;
+ Code* code = debug_info->code();
+ DCHECK(0 <= offset && offset < code->instruction_size());
+ Address pc = debug_info->code()->instruction_start() + offset;
for (Iterator it(debug_info, ALL_BREAK_LOCATIONS); !it.Done(); it.Next()) {
// Check if this break point is closer that what was previously found.
if (it.pc() <= pc && pc - it.pc() < distance) {
@@ -222,14 +234,14 @@ void BreakLocation::SetBreakPoint(Handle<Object> break_point_object) {
if (!HasBreakPoint()) SetDebugBreak();
DCHECK(IsDebugBreak() || IsDebuggerStatement());
// Set the break point information.
- DebugInfo::SetBreakPoint(debug_info_, pc_offset_, position_,
+ DebugInfo::SetBreakPoint(debug_info_, code_offset_, position_,
statement_position_, break_point_object);
}
void BreakLocation::ClearBreakPoint(Handle<Object> break_point_object) {
// Clear the break point information.
- DebugInfo::ClearBreakPoint(debug_info_, pc_offset_, break_point_object);
+ DebugInfo::ClearBreakPoint(debug_info_, code_offset_, break_point_object);
// If there are no more break points here remove the debug break.
if (!HasBreakPoint()) {
ClearDebugBreak();
@@ -307,7 +319,7 @@ bool BreakLocation::IsDebugBreak() const {
Handle<Object> BreakLocation::BreakPointObjects() const {
- return debug_info_->GetBreakPointObjects(pc_offset_);
+ return debug_info_->GetBreakPointObjects(code_offset_);
}
@@ -684,11 +696,8 @@ void Debug::ClearBreakPoint(Handle<Object> break_point_object) {
Handle<BreakPointInfo>::cast(result);
Handle<DebugInfo> debug_info = node->debug_info();
- // Find the break point and clear it.
- Address pc =
- debug_info->code()->entry() + break_point_info->code_position();
-
- BreakLocation location = BreakLocation::FromAddress(debug_info, pc);
+ BreakLocation location = BreakLocation::FromCodeOffset(
+ debug_info, break_point_info->code_offset());
location.ClearBreakPoint(break_point_object);
// If there are no more break points left remove the debug info for this
@@ -859,17 +868,21 @@ void Debug::PrepareStep(StepAction step_action) {
Handle<DebugInfo> debug_info(shared->GetDebugInfo());
// Refresh frame summary if the code has been recompiled for debugging.
- if (shared->code() != *summary.code()) summary = GetFirstFrameSummary(frame);
+ if (shared->AbstractCode() != *summary.abstract_code()) {
+ summary = GetFirstFrameSummary(frame);
+ }
// PC points to the instruction after the current one, possibly a break
// location as well. So the "- 1" to exclude it from the search.
- BreakLocation location = BreakLocation::FromFrame(debug_info, &summary);
+ BreakLocation location =
+ BreakLocation::FromCodeOffset(debug_info, summary.code_offset() - 1);
// At a return statement we will step out either way.
if (location.IsReturn()) step_action = StepOut;
+ Address pc = debug_info->code()->instruction_start() + summary.code_offset();
thread_local_.last_statement_position_ =
- debug_info->code()->SourceStatementPosition(summary.pc());
+ debug_info->code()->SourceStatementPosition(pc);
thread_local_.last_fp_ = frame->UnpaddedFP();
switch (step_action) {
@@ -1481,16 +1494,19 @@ void Debug::GetStepinPositions(JavaScriptFrame* frame, StackFrame::Id frame_id,
Handle<DebugInfo> debug_info(shared->GetDebugInfo());
// Refresh frame summary if the code has been recompiled for debugging.
- if (shared->code() != *summary.code()) summary = GetFirstFrameSummary(frame);
+ if (shared->AbstractCode() != *summary.abstract_code()) {
+ summary = GetFirstFrameSummary(frame);
+ }
// Find range of break points starting from the break point where execution
// has stopped.
rmcilroy 2016/01/22 19:16:34 Nit - could you add a comment on the -1 here too.
Yang 2016/01/28 09:09:53 Done.
- Address call_pc = summary.pc() - 1;
+ int call_offset = summary.code_offset() - 1;
List<BreakLocation> locations;
- BreakLocation::FromAddressSameStatement(debug_info, call_pc, &locations);
+ BreakLocation::FromCodeOffsetSameStatement(debug_info, call_offset,
+ &locations);
for (BreakLocation location : locations) {
- if (location.pc() <= summary.pc()) {
+ if (location.code_offset() <= summary.code_offset()) {
// The break point is near our pc. Could be a step-in possibility,
// that is currently taken by active debugger call.
if (break_frame_id() == StackFrame::NO_ID) {
« no previous file with comments | « src/debug/debug.h ('k') | src/frames.h » ('j') | src/frames.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698