| Index: src/wasm/wasm-debug.cc
|
| diff --git a/src/wasm/wasm-debug.cc b/src/wasm/wasm-debug.cc
|
| index 33135c4ffc46a67fadc0496b0226ebe930b22830..8ffaa9d2365a2df3462191d009f82292ebe24b45 100644
|
| --- a/src/wasm/wasm-debug.cc
|
| +++ b/src/wasm/wasm-debug.cc
|
| @@ -273,6 +273,11 @@ class InterpreterHandle {
|
| return std::unique_ptr<wasm::InterpretedFrame>(
|
| new wasm::InterpretedFrame(thread->GetMutableFrame(idx)));
|
| }
|
| +
|
| + uint64_t NumInterpretedCalls() {
|
| + DCHECK_EQ(1, interpreter()->GetThreadCount());
|
| + return interpreter()->GetThread(0)->NumInterpretedCalls();
|
| + }
|
| };
|
|
|
| InterpreterHandle* GetOrCreateInterpreterHandle(
|
| @@ -294,6 +299,12 @@ InterpreterHandle* GetInterpreterHandle(WasmDebugInfo* debug_info) {
|
| return Managed<InterpreterHandle>::cast(handle_obj)->get();
|
| }
|
|
|
| +InterpreterHandle* GetInterpreterHandleOrNull(WasmDebugInfo* debug_info) {
|
| + Object* handle_obj = debug_info->get(WasmDebugInfo::kInterpreterHandle);
|
| + if (handle_obj->IsUndefined(debug_info->GetIsolate())) return nullptr;
|
| + return Managed<InterpreterHandle>::cast(handle_obj)->get();
|
| +}
|
| +
|
| int GetNumFunctions(WasmInstanceObject* instance) {
|
| size_t num_functions =
|
| instance->compiled_module()->module()->functions.size();
|
| @@ -345,26 +356,6 @@ void RedirectCallsitesInInstance(Isolate* isolate, WasmInstanceObject* instance,
|
| }
|
| }
|
|
|
| -void EnsureRedirectToInterpreter(Isolate* isolate,
|
| - Handle<WasmDebugInfo> debug_info,
|
| - int func_index) {
|
| - Handle<FixedArray> interpreted_functions =
|
| - GetOrCreateInterpretedFunctions(isolate, debug_info);
|
| - if (!interpreted_functions->get(func_index)->IsUndefined(isolate)) return;
|
| -
|
| - Handle<WasmInstanceObject> instance(debug_info->wasm_instance(), isolate);
|
| - Handle<Code> new_code = compiler::CompileWasmInterpreterEntry(
|
| - isolate, func_index,
|
| - instance->compiled_module()->module()->functions[func_index].sig,
|
| - instance);
|
| -
|
| - Handle<FixedArray> code_table = instance->compiled_module()->code_table();
|
| - Handle<Code> old_code(Code::cast(code_table->get(func_index)), isolate);
|
| - interpreted_functions->set(func_index, *new_code);
|
| -
|
| - RedirectCallsitesInInstance(isolate, *instance, *old_code, *new_code);
|
| -}
|
| -
|
| } // namespace
|
|
|
| Handle<WasmDebugInfo> WasmDebugInfo::New(Handle<WasmInstanceObject> instance) {
|
| @@ -400,12 +391,34 @@ void WasmDebugInfo::SetBreakpoint(Handle<WasmDebugInfo> debug_info,
|
| int func_index, int offset) {
|
| Isolate* isolate = debug_info->GetIsolate();
|
| InterpreterHandle* handle = GetOrCreateInterpreterHandle(isolate, debug_info);
|
| - WasmInterpreter* interpreter = handle->interpreter();
|
| - DCHECK_LE(0, func_index);
|
| - DCHECK_GT(handle->module()->functions.size(), func_index);
|
| + RedirectToInterpreter(debug_info, func_index);
|
| const WasmFunction* func = &handle->module()->functions[func_index];
|
| - interpreter->SetBreakpoint(func, offset, true);
|
| - EnsureRedirectToInterpreter(isolate, debug_info, func_index);
|
| + handle->interpreter()->SetBreakpoint(func, offset, true);
|
| +}
|
| +
|
| +void WasmDebugInfo::RedirectToInterpreter(Handle<WasmDebugInfo> debug_info,
|
| + int func_index) {
|
| + Isolate* isolate = debug_info->GetIsolate();
|
| + DCHECK_LE(0, func_index);
|
| + DCHECK_GT(debug_info->wasm_instance()->module()->functions.size(),
|
| + func_index);
|
| + Handle<FixedArray> interpreted_functions =
|
| + GetOrCreateInterpretedFunctions(isolate, debug_info);
|
| + if (!interpreted_functions->get(func_index)->IsUndefined(isolate)) return;
|
| +
|
| + // Ensure that the interpreter is instantiated.
|
| + GetOrCreateInterpreterHandle(isolate, debug_info);
|
| + Handle<WasmInstanceObject> instance(debug_info->wasm_instance(), isolate);
|
| + Handle<Code> new_code = compiler::CompileWasmInterpreterEntry(
|
| + isolate, func_index,
|
| + instance->compiled_module()->module()->functions[func_index].sig,
|
| + instance);
|
| +
|
| + Handle<FixedArray> code_table = instance->compiled_module()->code_table();
|
| + Handle<Code> old_code(Code::cast(code_table->get(func_index)), isolate);
|
| + interpreted_functions->set(func_index, *new_code);
|
| +
|
| + RedirectCallsitesInInstance(isolate, *instance, *old_code, *new_code);
|
| }
|
|
|
| void WasmDebugInfo::PrepareStep(StepAction step_action) {
|
| @@ -427,3 +440,8 @@ std::unique_ptr<wasm::InterpretedFrame> WasmDebugInfo::GetInterpretedFrame(
|
| Address frame_pointer, int idx) {
|
| return GetInterpreterHandle(this)->GetInterpretedFrame(frame_pointer, idx);
|
| }
|
| +
|
| +uint64_t WasmDebugInfo::NumInterpretedCalls() {
|
| + auto handle = GetInterpreterHandleOrNull(this);
|
| + return handle ? handle->NumInterpretedCalls() : 0;
|
| +}
|
|
|