| Index: src/wasm/wasm-interpreter.cc
|
| diff --git a/src/wasm/wasm-interpreter.cc b/src/wasm/wasm-interpreter.cc
|
| index 4bb215a51ac2e7f13d7dc677def634abe16b052b..27e38605358a5b1c23d8e5e21b62211436484db4 100644
|
| --- a/src/wasm/wasm-interpreter.cc
|
| +++ b/src/wasm/wasm-interpreter.cc
|
| @@ -985,16 +985,22 @@ class ThreadImpl {
|
| possible_nondeterminism_ = false;
|
| }
|
|
|
| - int GetFrameCount() { return static_cast<int>(frames_.size()); }
|
| -
|
| - const WasmFrame* GetFrame(int index) {
|
| - UNIMPLEMENTED();
|
| - return nullptr;
|
| + int GetFrameCount() {
|
| + DCHECK_GE(kMaxInt, frames_.size());
|
| + return static_cast<int>(frames_.size());
|
| }
|
|
|
| - WasmFrame* GetMutableFrame(int index) {
|
| - UNIMPLEMENTED();
|
| - return nullptr;
|
| + template <typename FrameCons>
|
| + InterpretedFrame GetMutableFrame(int index, FrameCons frame_cons) {
|
| + DCHECK_LE(0, index);
|
| + DCHECK_GT(frames_.size(), index);
|
| + Frame* frame = &frames_[index];
|
| + DCHECK_GE(kMaxInt, frame->ret_pc);
|
| + DCHECK_GE(kMaxInt, frame->sp);
|
| + DCHECK_GE(kMaxInt, frame->llimit());
|
| + return frame_cons(frame->code->function, static_cast<int>(frame->ret_pc),
|
| + static_cast<int>(frame->sp),
|
| + static_cast<int>(frame->llimit()));
|
| }
|
|
|
| WasmVal GetReturnValue(int index) {
|
| @@ -1747,11 +1753,16 @@ pc_t WasmInterpreter::Thread::GetBreakpointPc() {
|
| int WasmInterpreter::Thread::GetFrameCount() {
|
| return ToImpl(this)->GetFrameCount();
|
| }
|
| -const WasmFrame* WasmInterpreter::Thread::GetFrame(int index) {
|
| - return ToImpl(this)->GetFrame(index);
|
| +const InterpretedFrame WasmInterpreter::Thread::GetFrame(int index) {
|
| + return GetMutableFrame(index);
|
| }
|
| -WasmFrame* WasmInterpreter::Thread::GetMutableFrame(int index) {
|
| - return ToImpl(this)->GetMutableFrame(index);
|
| +InterpretedFrame WasmInterpreter::Thread::GetMutableFrame(int index) {
|
| + // We have access to the constructor of InterpretedFrame, but ThreadImpl has
|
| + // not. So pass it as a lambda (should all get inlined).
|
| + auto frame_cons = [](const WasmFunction* function, int pc, int fp, int sp) {
|
| + return InterpretedFrame(function, pc, fp, sp);
|
| + };
|
| + return ToImpl(this)->GetMutableFrame(index, frame_cons);
|
| }
|
| WasmVal WasmInterpreter::Thread::GetReturnValue(int index) {
|
| return ToImpl(this)->GetReturnValue(index);
|
| @@ -1844,29 +1855,6 @@ WasmInterpreter::Thread* WasmInterpreter::GetThread(int id) {
|
| return ToThread(&internals_->threads_[id]);
|
| }
|
|
|
| -WasmVal WasmInterpreter::GetLocalVal(const WasmFrame* frame, int index) {
|
| - CHECK_GE(index, 0);
|
| - UNIMPLEMENTED();
|
| - WasmVal none;
|
| - none.type = kWasmStmt;
|
| - return none;
|
| -}
|
| -
|
| -WasmVal WasmInterpreter::GetExprVal(const WasmFrame* frame, int pc) {
|
| - UNIMPLEMENTED();
|
| - WasmVal none;
|
| - none.type = kWasmStmt;
|
| - return none;
|
| -}
|
| -
|
| -void WasmInterpreter::SetLocalVal(WasmFrame* frame, int index, WasmVal val) {
|
| - UNIMPLEMENTED();
|
| -}
|
| -
|
| -void WasmInterpreter::SetExprVal(WasmFrame* frame, int pc, WasmVal val) {
|
| - UNIMPLEMENTED();
|
| -}
|
| -
|
| size_t WasmInterpreter::GetMemorySize() {
|
| return internals_->instance_->mem_size;
|
| }
|
| @@ -1896,6 +1884,35 @@ ControlTransferMap WasmInterpreter::ComputeControlTransfersForTesting(
|
| return targets.map_;
|
| }
|
|
|
| +//============================================================================
|
| +// Implementation of the frame inspection interface.
|
| +//============================================================================
|
| +int InterpretedFrame::GetParameterCount() const {
|
| + USE(fp_);
|
| + USE(sp_);
|
| + // TODO(clemensh): Return the correct number of parameters.
|
| + return 0;
|
| +}
|
| +
|
| +WasmVal InterpretedFrame::GetLocalVal(int index) const {
|
| + CHECK_GE(index, 0);
|
| + UNIMPLEMENTED();
|
| + WasmVal none;
|
| + none.type = kWasmStmt;
|
| + return none;
|
| +}
|
| +
|
| +WasmVal InterpretedFrame::GetExprVal(int pc) const {
|
| + UNIMPLEMENTED();
|
| + WasmVal none;
|
| + none.type = kWasmStmt;
|
| + return none;
|
| +}
|
| +
|
| +void InterpretedFrame::SetLocalVal(int index, WasmVal val) { UNIMPLEMENTED(); }
|
| +
|
| +void InterpretedFrame::SetExprVal(int pc, WasmVal val) { UNIMPLEMENTED(); }
|
| +
|
| } // namespace wasm
|
| } // namespace internal
|
| } // namespace v8
|
|
|