Index: src/wasm/wasm-debug.cc |
diff --git a/src/wasm/wasm-debug.cc b/src/wasm/wasm-debug.cc |
index b2e2bd08453b66d957ac7c2919883a6472808c1d..bb9bb07c06e418855c9abe983b29c6e24d0332b3 100644 |
--- a/src/wasm/wasm-debug.cc |
+++ b/src/wasm/wasm-debug.cc |
@@ -25,13 +25,15 @@ class InterpreterHandle { |
AccountingAllocator allocator_; |
WasmInstance instance_; |
WasmInterpreter interpreter_; |
+ Isolate *isolate_; |
public: |
// Initialize in the right order, using helper methods to make this possible. |
// WasmInterpreter has to be allocated in place, since it is not movable. |
InterpreterHandle(Isolate *isolate, WasmDebugInfo *debug_info) |
: instance_(debug_info->wasm_instance()->compiled_module()->module()), |
- interpreter_(GetBytesEnv(&instance_, debug_info), &allocator_) { |
+ interpreter_(GetBytesEnv(&instance_, debug_info), &allocator_), |
+ isolate_(isolate) { |
Handle<JSArrayBuffer> mem_buffer = |
handle(debug_info->wasm_instance()->memory_buffer(), isolate); |
if (mem_buffer->IsUndefined(isolate)) { |
@@ -97,7 +99,8 @@ class InterpreterHandle { |
switch (state) { |
case WasmInterpreter::State::PAUSED: { |
// We hit a breakpoint. |
- // TODO(clemensh): Handle this. |
+ StackTraceFrameIterator frame_it(isolate_); |
+ isolate_->debug()->Break(frame_it.frame()); |
} break; |
case WasmInterpreter::State::FINISHED: |
// Perfect, just break the switch and exit the loop. |
@@ -136,6 +139,30 @@ class InterpreterHandle { |
} |
} |
} |
+ |
+ std::vector<std::pair<uint32_t, int>> GetInterpretedStack( |
+ Address frame_pointer) { |
+ // TODO(clemensh): Use frame_pointer. |
+ USE(frame_pointer); |
+ |
+ DCHECK_EQ(1, interpreter()->GetThreadCount()); |
+ WasmInterpreter::Thread *thread = interpreter()->GetThread(0); |
+ std::vector<std::pair<uint32_t, int>> stack; |
+ for (int i = thread->GetFrameCount() - 1; i >= 0; --i) { |
+ wasm::InterpretedFrame frame = thread->GetFrame(0); |
+ stack.push_back({frame.function()->func_index, frame.pc()}); |
+ } |
+ return stack; |
+ } |
+ |
+ wasm::InterpretedFrame GetInterpretedFrame(Address frame_pointer, int idx) { |
+ // TODO(clemensh): Use frame_pointer. |
+ USE(frame_pointer); |
+ |
+ DCHECK_EQ(1, interpreter()->GetThreadCount()); |
+ WasmInterpreter::Thread *thread = interpreter()->GetThread(0); |
+ return thread->GetMutableFrame(idx); |
+ } |
}; |
InterpreterHandle *GetOrCreateInterpreterHandle( |
@@ -272,3 +299,18 @@ void WasmDebugInfo::RunInterpreter(Handle<WasmDebugInfo> debug_info, |
GetOrCreateInterpreterHandle(debug_info->GetIsolate(), debug_info); |
interp_handle->Execute(static_cast<uint32_t>(func_index), arg_buffer); |
} |
+ |
+std::vector<std::pair<uint32_t, int>> WasmDebugInfo::GetInterpretedStack( |
+ Handle<WasmDebugInfo> debug_info, Address frame_pointer) { |
+ InterpreterHandle *interp_handle = |
+ GetOrCreateInterpreterHandle(debug_info->GetIsolate(), debug_info); |
+ return interp_handle->GetInterpretedStack(frame_pointer); |
+} |
+ |
+std::unique_ptr<wasm::InterpretedFrame> WasmDebugInfo::GetInterpretedFrame( |
+ Handle<WasmDebugInfo> debug_info, Address frame_pointer, int idx) { |
+ InterpreterHandle *interp_handle = |
+ GetOrCreateInterpreterHandle(debug_info->GetIsolate(), debug_info); |
+ return std::unique_ptr<wasm::InterpretedFrame>(new wasm::InterpretedFrame( |
+ interp_handle->GetInterpretedFrame(frame_pointer, idx))); |
+} |