Chromium Code Reviews| Index: src/debug/debug.cc |
| diff --git a/src/debug/debug.cc b/src/debug/debug.cc |
| index c69b04b0c8327f5dd95a90a8b8ddb945b2ecbe07..7287ceb1865ab214ad49bfbfd08d2a87f13b8733 100644 |
| --- a/src/debug/debug.cc |
| +++ b/src/debug/debug.cc |
| @@ -22,12 +22,34 @@ |
| #include "src/log.h" |
| #include "src/messages.h" |
| #include "src/snapshot/natives.h" |
| +#include "src/wasm/wasm-debug.h" |
| +#include "src/wasm/wasm-module.h" |
| #include "include/v8-debug.h" |
| namespace v8 { |
| namespace internal { |
| +namespace { |
| + |
| +int GetCodeOffset(StandardFrame* frame) { |
| + if (frame->is_java_script()) { |
| + return FrameSummary::GetFirst(JavaScriptFrame::cast(frame)).code_offset(); |
|
Yang
2016/06/16 14:10:41
Is it not feasible to extend FrameSummary for wasm
Clemens Hammacher
2016/06/16 17:02:31
FrameSummary is very JS-specific, and it's only pu
|
| + } |
| + DCHECK(frame->is_wasm()); |
| + return static_cast<int>(frame->pc() - |
| + frame->unchecked_code()->instruction_start()); |
| +} |
| + |
| +inline int CallOffsetFromCodeOffset(int code_offset, bool is_interpreted) { |
| + // Code offset points to the instruction after the call. Subtract 1 to |
| + // exclude that instruction from the search. For bytecode, the code offset |
| + // still points to the call. |
| + return is_interpreted ? code_offset : code_offset - 1; |
| +} |
| + |
| +} // namespace |
| + |
| Debug::Debug(Isolate* isolate) |
| : debug_context_(Handle<Context>()), |
| event_listener_(Handle<Object>()), |
| @@ -260,18 +282,11 @@ BreakLocation BreakLocation::FromCodeOffset(Handle<DebugInfo> debug_info, |
| return it->GetBreakLocation(); |
| } |
| -int CallOffsetFromCodeOffset(int code_offset, bool is_interpreted) { |
| - // Code offset points to the instruction after the call. Subtract 1 to |
| - // exclude that instruction from the search. For bytecode, the code offset |
| - // still points to the call. |
| - return is_interpreted ? code_offset : code_offset - 1; |
| -} |
| - |
| BreakLocation BreakLocation::FromFrame(Handle<DebugInfo> debug_info, |
| - JavaScriptFrame* frame) { |
| - FrameSummary summary = FrameSummary::GetFirst(frame); |
| + StandardFrame* frame) { |
| + int code_offset = GetCodeOffset(frame); |
| int call_offset = |
| - CallOffsetFromCodeOffset(summary.code_offset(), frame->is_interpreted()); |
| + CallOffsetFromCodeOffset(code_offset, frame->is_interpreted()); |
| return FromCodeOffset(debug_info, call_offset); |
| } |
| @@ -793,6 +808,9 @@ bool Debug::SetBreakPointForScript(Handle<Script> script, |
| Handle<Object> break_point_object, |
| int* source_position, |
| BreakPositionAlignment alignment) { |
| + if (script->type() == Script::TYPE_WASM) { |
| + // TODO(clemensh): set breakpoint for wasm. |
| + } |
| HandleScope scope(isolate_); |
| // Obtain shared function info for the function. |
| @@ -1601,23 +1619,26 @@ void Debug::SetAfterBreakTarget(JavaScriptFrame* frame) { |
| } |
| } |
| - |
| -bool Debug::IsBreakAtReturn(JavaScriptFrame* frame) { |
| +bool Debug::IsBreakAtReturn(StandardFrame* frame) { |
| HandleScope scope(isolate_); |
| + if (frame->is_wasm()) { |
| + // TODO(clemensh): find out what we want to do for wasm |
| + return false; |
| + } |
| + |
| + JavaScriptFrame* js_frame = JavaScriptFrame::cast(frame); |
| // Get the executing function in which the debug break occurred. |
| - Handle<JSFunction> function(JSFunction::cast(frame->function())); |
| - Handle<SharedFunctionInfo> shared(function->shared()); |
| + Handle<SharedFunctionInfo> shared(js_frame->function()->shared()); |
| // With no debug info there are no break points, so we can't be at a return. |
| if (!shared->HasDebugInfo()) return false; |
| DCHECK(!frame->is_optimized()); |
| - FrameSummary summary = FrameSummary::GetFirst(frame); |
| - |
| + int code_offset = GetCodeOffset(frame); |
|
Yang
2016/06/16 14:10:41
At this point the frame is already known to be a j
Clemens Hammacher
2016/06/16 17:02:31
Right, but calling the function we already have se
|
| Handle<DebugInfo> debug_info(shared->GetDebugInfo()); |
| BreakLocation location = |
| - BreakLocation::FromCodeOffset(debug_info, summary.code_offset()); |
| + BreakLocation::FromCodeOffset(debug_info, code_offset); |
| return location.IsReturn() || location.IsTailCall(); |
| } |
| @@ -2305,10 +2326,10 @@ DebugScope::DebugScope(Debug* debug) |
| // Create the new break info. If there is no JavaScript frames there is no |
| // break frame id. |
| - JavaScriptFrameIterator it(isolate()); |
| - bool has_js_frames = !it.done(); |
| - debug_->thread_local_.break_frame_id_ = has_js_frames ? it.frame()->id() |
| - : StackFrame::NO_ID; |
| + StackTraceFrameIterator it(isolate()); |
| + bool has_frames = !it.done(); |
| + debug_->thread_local_.break_frame_id_ = |
| + has_frames ? it.frame()->id() : StackFrame::NO_ID; |
| debug_->SetNextBreakId(); |
| debug_->UpdateState(); |