Commit 85fdbd91 authored by Benedikt Meurer's avatar Benedikt Meurer Committed by Commit Bot

[inspector][wasm] Unify locals, stack, and globals objects.

This change unifies the locals, stack, and globals objects exposed for
WebAssembly frames via the Scope view and via DebugEvaluate to use the
same underlying objects (implemented via interceptors). This also
means that for locals and globals we now consistently expose names
prefixed by a dollar symbol everywhere.

Drive-by-fix: Move the debug::ScopeIterator implementation for WasmFrame
into debug-wasm-support.cc, so WebAssembly scope details are all found
in one place instead of scattered around the code.

Drive-by-cleanup: Rename GetJSDebugProxy to GetWasmDebugProxy for
consistency. GetJSDebugProxy is a bit misleading, since the debug proxy
is not about JavaScript, but just exposed to JavaScript.

Doc: http://bit.ly/devtools-wasm-entities
Bug: chromium:1159307, chromium:1127914, chromium:1162229
Change-Id: If932bd06bbce72542823f63dac1bd976ab33937a
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2615348
Commit-Queue: Benedikt Meurer <bmeurer@chromium.org>
Auto-Submit: Benedikt Meurer <bmeurer@chromium.org>
Reviewed-by: 's avatarYang Guo <yangguo@chromium.org>
Cr-Commit-Position: refs/heads/master@{#72009}
parent 0316b4fc
......@@ -100,7 +100,7 @@ MaybeHandle<Object> DebugEvaluate::Local(Isolate* isolate,
WasmFrame* frame = WasmFrame::cast(it.frame());
Handle<SharedFunctionInfo> outer_info(
isolate->native_context()->empty_function().shared(), isolate);
Handle<JSObject> context_extension = GetJSDebugProxy(frame);
Handle<JSObject> context_extension = GetWasmDebugProxy(frame);
Handle<ScopeInfo> scope_info =
ScopeInfo::CreateForWithScope(isolate, Handle<ScopeInfo>::null());
Handle<Context> context = isolate->factory()->NewWithContext(
......
......@@ -5,14 +5,11 @@
#include "src/debug/debug-scope-iterator.h"
#include "src/api/api-inl.h"
#include "src/debug/debug-wasm-support.h"
#include "src/debug/debug.h"
#include "src/debug/liveedit.h"
#include "src/execution/frames-inl.h"
#include "src/execution/isolate.h"
#include "src/objects/js-generator-inl.h"
#include "src/wasm/wasm-debug.h"
#include "src/wasm/wasm-objects-inl.h"
namespace v8 {
......@@ -129,92 +126,5 @@ bool DebugScopeIterator::SetVariableValue(v8::Local<v8::String> name,
Utils::OpenHandle(*value));
}
DebugWasmScopeIterator::DebugWasmScopeIterator(Isolate* isolate,
WasmFrame* frame)
: isolate_(isolate),
frame_(frame),
type_(debug::ScopeIterator::ScopeTypeWasmExpressionStack) {
// Skip local scope and expression stack scope if the frame is not
// inspectable.
if (!frame->is_inspectable()) {
type_ = debug::ScopeIterator::ScopeTypeModule;
}
}
bool DebugWasmScopeIterator::Done() {
return type_ == debug::ScopeIterator::ScopeTypeWith;
}
void DebugWasmScopeIterator::Advance() {
DCHECK(!Done());
switch (type_) {
case ScopeTypeWasmExpressionStack:
type_ = debug::ScopeIterator::ScopeTypeLocal;
break;
case ScopeTypeLocal:
type_ = debug::ScopeIterator::ScopeTypeModule;
break;
case ScopeTypeModule:
// We use ScopeTypeWith type as marker for done.
type_ = debug::ScopeIterator::ScopeTypeWith;
break;
default:
UNREACHABLE();
}
}
v8::debug::ScopeIterator::ScopeType DebugWasmScopeIterator::GetType() {
DCHECK(!Done());
return type_;
}
v8::Local<v8::Object> DebugWasmScopeIterator::GetObject() {
DCHECK(!Done());
switch (type_) {
case debug::ScopeIterator::ScopeTypeModule: {
Handle<WasmInstanceObject> instance =
FrameSummary::GetTop(frame_).AsWasm().wasm_instance();
return Utils::ToLocal(GetModuleScopeObject(instance));
}
case debug::ScopeIterator::ScopeTypeLocal: {
DCHECK(frame_->is_inspectable());
return Utils::ToLocal(GetLocalScopeObject(frame_));
}
case debug::ScopeIterator::ScopeTypeWasmExpressionStack: {
DCHECK(frame_->is_inspectable());
return Utils::ToLocal(GetStackScopeObject(frame_));
}
default:
return {};
}
}
int DebugWasmScopeIterator::GetScriptId() {
DCHECK(!Done());
return -1;
}
v8::Local<v8::Value> DebugWasmScopeIterator::GetFunctionDebugName() {
DCHECK(!Done());
return Utils::ToLocal(isolate_->factory()->empty_string());
}
bool DebugWasmScopeIterator::HasLocationInfo() { return false; }
debug::Location DebugWasmScopeIterator::GetStartLocation() {
DCHECK(!Done());
return debug::Location();
}
debug::Location DebugWasmScopeIterator::GetEndLocation() {
DCHECK(!Done());
return debug::Location();
}
bool DebugWasmScopeIterator::SetVariableValue(v8::Local<v8::String> name,
v8::Local<v8::Value> value) {
DCHECK(!Done());
return false;
}
} // namespace internal
} // namespace v8
......@@ -37,27 +37,6 @@ class DebugScopeIterator final : public debug::ScopeIterator {
v8::internal::ScopeIterator iterator_;
};
class DebugWasmScopeIterator final : public debug::ScopeIterator {
public:
DebugWasmScopeIterator(Isolate* isolate, WasmFrame* frame);
bool Done() override;
void Advance() override;
ScopeType GetType() override;
v8::Local<v8::Object> GetObject() override;
v8::Local<v8::Value> GetFunctionDebugName() override;
int GetScriptId() override;
bool HasLocationInfo() override;
debug::Location GetStartLocation() override;
debug::Location GetEndLocation() override;
bool SetVariableValue(v8::Local<v8::String> name,
v8::Local<v8::Value> value) override;
private:
Isolate* isolate_;
WasmFrame* frame_;
ScopeType type_;
};
} // namespace internal
} // namespace v8
......
......@@ -7,6 +7,7 @@
#include "src/api/api-inl.h"
#include "src/debug/debug-evaluate.h"
#include "src/debug/debug-scope-iterator.h"
#include "src/debug/debug-wasm-support.h"
#include "src/debug/debug.h"
#include "src/debug/liveedit.h"
#include "src/execution/frames-inl.h"
......@@ -160,8 +161,7 @@ DebugStackTraceIterator::GetScopeIterator() const {
DCHECK(!Done());
CommonFrame* frame = iterator_.frame();
if (frame->is_wasm()) {
return std::make_unique<DebugWasmScopeIterator>(isolate_,
WasmFrame::cast(frame));
return GetWasmScopeIterator(WasmFrame::cast(frame));
}
return std::make_unique<DebugScopeIterator>(isolate_, frame_inspector_.get());
}
......
This diff is collapsed.
......@@ -5,19 +5,23 @@
#ifndef V8_DEBUG_DEBUG_WASM_SUPPORT_H_
#define V8_DEBUG_DEBUG_WASM_SUPPORT_H_
#include <memory>
namespace v8 {
namespace debug {
class ScopeIterator;
} // namespace debug
namespace internal {
template <typename T>
class Handle;
class JSObject;
class WasmFrame;
class WasmInstanceObject;
Handle<JSObject> GetModuleScopeObject(Handle<WasmInstanceObject> instance);
Handle<JSObject> GetLocalScopeObject(WasmFrame* frame);
Handle<JSObject> GetStackScopeObject(WasmFrame* frame);
Handle<JSObject> GetJSDebugProxy(WasmFrame* frame);
Handle<JSObject> GetWasmDebugProxy(WasmFrame* frame);
std::unique_ptr<debug::ScopeIterator> GetWasmScopeIterator(WasmFrame* frame);
} // namespace internal
} // namespace v8
......
......@@ -5,4 +5,4 @@ Waiting for wasm script to be parsed.
Setting breakpoint in wasm.
Running main.
Paused in debugger.
globals: {"module_name.imported_global", "exported_global", "global2"}
globals: {"$module_name.imported_global", "$exported_global", "$global2"}
......@@ -5,17 +5,17 @@ Waiting for wasm script to be parsed.
Setting breakpoint in wasm.
Running main.
Paused in debugger.
name: memory0
name: $memory0
Finished.
Waiting for wasm script to be parsed.
Setting breakpoint in wasm.
Running main.
Paused in debugger.
name: exported_memory
name: $exported_memory
Finished.
Waiting for wasm script to be parsed.
Setting breakpoint in wasm.
Running main.
Paused in debugger.
name: module_name.imported_mem
name: $module_name.imported_mem
Finished.
......@@ -17,7 +17,7 @@ at wasm_A (0:38):
at wasm_B (0:56):
- scope (wasm-expression-stack):
- scope (local):
var0: 3 (number)
$var0: 3 (number)
- scope (module):
instance: exports: "main" (Function)
module: Module
......@@ -44,7 +44,7 @@ at wasm_A (0:39):
at wasm_B (0:56):
- scope (wasm-expression-stack):
- scope (local):
var0: 3 (number)
$var0: 3 (number)
- scope (module):
instance: exports: "main" (Function)
module: Module
......@@ -56,7 +56,7 @@ Scope:
at wasm_B (0:45):
- scope (wasm-expression-stack):
- scope (local):
var0: 3 (number)
$var0: 3 (number)
- scope (module):
instance: exports: "main" (Function)
module: Module
......@@ -69,7 +69,7 @@ at wasm_B (0:47):
- scope (wasm-expression-stack):
0: 3 (number)
- scope (local):
var0: 3 (number)
$var0: 3 (number)
- scope (module):
instance: exports: "main" (Function)
module: Module
......@@ -81,7 +81,7 @@ Scope:
at wasm_B (0:49):
- scope (wasm-expression-stack):
- scope (local):
var0: 3 (number)
$var0: 3 (number)
- scope (module):
instance: exports: "main" (Function)
module: Module
......@@ -94,7 +94,7 @@ at wasm_B (0:51):
- scope (wasm-expression-stack):
0: 3 (number)
- scope (local):
var0: 3 (number)
$var0: 3 (number)
- scope (module):
instance: exports: "main" (Function)
module: Module
......@@ -108,7 +108,7 @@ at wasm_B (0:53):
0: 3 (number)
1: 1 (number)
- scope (local):
var0: 3 (number)
$var0: 3 (number)
- scope (module):
instance: exports: "main" (Function)
module: Module
......@@ -121,7 +121,7 @@ at wasm_B (0:54):
- scope (wasm-expression-stack):
0: 2 (number)
- scope (local):
var0: 3 (number)
$var0: 3 (number)
- scope (module):
instance: exports: "main" (Function)
module: Module
......@@ -139,7 +139,7 @@ at wasm_A (0:38):
at wasm_B (0:56):
- scope (wasm-expression-stack):
- scope (local):
var0: 2 (number)
$var0: 2 (number)
- scope (module):
instance: exports: "main" (Function)
module: Module
......@@ -157,7 +157,7 @@ at wasm_A (0:39):
at wasm_B (0:56):
- scope (wasm-expression-stack):
- scope (local):
var0: 2 (number)
$var0: 2 (number)
- scope (module):
instance: exports: "main" (Function)
module: Module
......@@ -169,7 +169,7 @@ Scope:
at wasm_B (0:45):
- scope (wasm-expression-stack):
- scope (local):
var0: 2 (number)
$var0: 2 (number)
- scope (module):
instance: exports: "main" (Function)
module: Module
......@@ -182,7 +182,7 @@ at wasm_B (0:47):
- scope (wasm-expression-stack):
0: 2 (number)
- scope (local):
var0: 2 (number)
$var0: 2 (number)
- scope (module):
instance: exports: "main" (Function)
module: Module
......@@ -194,7 +194,7 @@ Scope:
at wasm_B (0:49):
- scope (wasm-expression-stack):
- scope (local):
var0: 2 (number)
$var0: 2 (number)
- scope (module):
instance: exports: "main" (Function)
module: Module
......@@ -207,7 +207,7 @@ at wasm_B (0:51):
- scope (wasm-expression-stack):
0: 2 (number)
- scope (local):
var0: 2 (number)
$var0: 2 (number)
- scope (module):
instance: exports: "main" (Function)
module: Module
......@@ -221,7 +221,7 @@ at wasm_B (0:53):
0: 2 (number)
1: 1 (number)
- scope (local):
var0: 2 (number)
$var0: 2 (number)
- scope (module):
instance: exports: "main" (Function)
module: Module
......@@ -234,7 +234,7 @@ at wasm_B (0:54):
- scope (wasm-expression-stack):
0: 1 (number)
- scope (local):
var0: 2 (number)
$var0: 2 (number)
- scope (module):
instance: exports: "main" (Function)
module: Module
......@@ -252,7 +252,7 @@ at wasm_A (0:38):
at wasm_B (0:56):
- scope (wasm-expression-stack):
- scope (local):
var0: 1 (number)
$var0: 1 (number)
- scope (module):
instance: exports: "main" (Function)
module: Module
......@@ -270,7 +270,7 @@ at wasm_A (0:39):
at wasm_B (0:56):
- scope (wasm-expression-stack):
- scope (local):
var0: 1 (number)
$var0: 1 (number)
- scope (module):
instance: exports: "main" (Function)
module: Module
......@@ -282,7 +282,7 @@ Scope:
at wasm_B (0:45):
- scope (wasm-expression-stack):
- scope (local):
var0: 1 (number)
$var0: 1 (number)
- scope (module):
instance: exports: "main" (Function)
module: Module
......@@ -295,7 +295,7 @@ at wasm_B (0:47):
- scope (wasm-expression-stack):
0: 1 (number)
- scope (local):
var0: 1 (number)
$var0: 1 (number)
- scope (module):
instance: exports: "main" (Function)
module: Module
......@@ -307,7 +307,7 @@ Scope:
at wasm_B (0:49):
- scope (wasm-expression-stack):
- scope (local):
var0: 1 (number)
$var0: 1 (number)
- scope (module):
instance: exports: "main" (Function)
module: Module
......@@ -320,7 +320,7 @@ at wasm_B (0:51):
- scope (wasm-expression-stack):
0: 1 (number)
- scope (local):
var0: 1 (number)
$var0: 1 (number)
- scope (module):
instance: exports: "main" (Function)
module: Module
......@@ -334,7 +334,7 @@ at wasm_B (0:53):
0: 1 (number)
1: 1 (number)
- scope (local):
var0: 1 (number)
$var0: 1 (number)
- scope (module):
instance: exports: "main" (Function)
module: Module
......@@ -347,7 +347,7 @@ at wasm_B (0:54):
- scope (wasm-expression-stack):
0: 0 (number)
- scope (local):
var0: 1 (number)
$var0: 1 (number)
- scope (module):
instance: exports: "main" (Function)
module: Module
......@@ -365,7 +365,7 @@ at wasm_A (0:38):
at wasm_B (0:56):
- scope (wasm-expression-stack):
- scope (local):
var0: 0 (number)
$var0: 0 (number)
- scope (module):
instance: exports: "main" (Function)
module: Module
......@@ -383,7 +383,7 @@ at wasm_A (0:39):
at wasm_B (0:56):
- scope (wasm-expression-stack):
- scope (local):
var0: 0 (number)
$var0: 0 (number)
- scope (module):
instance: exports: "main" (Function)
module: Module
......@@ -395,7 +395,7 @@ Scope:
at wasm_B (0:45):
- scope (wasm-expression-stack):
- scope (local):
var0: 0 (number)
$var0: 0 (number)
- scope (module):
instance: exports: "main" (Function)
module: Module
......@@ -408,7 +408,7 @@ at wasm_B (0:47):
- scope (wasm-expression-stack):
0: 0 (number)
- scope (local):
var0: 0 (number)
$var0: 0 (number)
- scope (module):
instance: exports: "main" (Function)
module: Module
......@@ -420,7 +420,7 @@ Scope:
at wasm_B (0:61):
- scope (wasm-expression-stack):
- scope (local):
var0: 0 (number)
$var0: 0 (number)
- scope (module):
instance: exports: "main" (Function)
module: Module
......
......@@ -7,11 +7,11 @@ Paused at:
--- 0 ---
Script wasm://wasm/a9a86c5e byte offset 46: Wasm opcode 0x6d (kExprI32DivS)
scope at div (0:46):
a: 1
b: 0
unused: 4711
local_zero: 0
local_const_11: 11
$a: 1
$b: 0
$unused: 4711
$local_zero: 0
$local_const_11: 11
--- 1 ---
try {
instance.exports.#div(1, 0, 4711); // traps (div by zero)
......@@ -37,11 +37,11 @@ Paused at:
--- 0 ---
Script wasm://wasm/a9a86c5e byte offset 46: Wasm opcode 0x6d (kExprI32DivS)
scope at div (0:46):
a: -2147483648
b: -1
unused: 4711
local_zero: 0
local_const_11: 11
$a: -2147483648
$b: -1
$unused: 4711
$local_zero: 0
$local_const_11: 11
--- 1 ---
try {
instance.exports.#div(0x80000000, -1, 4711); // traps (unrepresentable)
......
......@@ -16,7 +16,7 @@ at wasm_B (0:54):
- scope (wasm-expression-stack):
{"0":3}
- scope (local):
{"var0":4}
{"$var0":4}
- scope (module):
-- skipped
at (anonymous) (0:17):
......@@ -28,7 +28,7 @@ at wasm_B (0:56):
- scope (wasm-expression-stack):
{}
- scope (local):
{"var0":3}
{"$var0":3}
- scope (module):
-- skipped
at (anonymous) (0:17):
......@@ -47,7 +47,7 @@ at wasm_B (0:56):
- scope (wasm-expression-stack):
{}
- scope (local):
{"var0":3}
{"$var0":3}
- scope (module):
-- skipped
at (anonymous) (0:17):
......@@ -66,7 +66,7 @@ at wasm_B (0:56):
- scope (wasm-expression-stack):
{}
- scope (local):
{"var0":3}
{"$var0":3}
- scope (module):
-- skipped
at (anonymous) (0:17):
......@@ -78,7 +78,7 @@ at wasm_B (0:58):
- scope (wasm-expression-stack):
{}
- scope (local):
{"var0":3}
{"$var0":3}
- scope (module):
-- skipped
at (anonymous) (0:17):
......@@ -90,7 +90,7 @@ at wasm_B (0:54):
- scope (wasm-expression-stack):
{"0":2}
- scope (local):
{"var0":3}
{"$var0":3}
- scope (module):
-- skipped
at (anonymous) (0:17):
......@@ -102,7 +102,7 @@ at wasm_B (0:56):
- scope (wasm-expression-stack):
{}
- scope (local):
{"var0":2}
{"$var0":2}
- scope (module):
-- skipped
at (anonymous) (0:17):
......@@ -114,7 +114,7 @@ at wasm_B (0:58):
- scope (wasm-expression-stack):
{}
- scope (local):
{"var0":2}
{"$var0":2}
- scope (module):
-- skipped
at (anonymous) (0:17):
......@@ -126,7 +126,7 @@ at wasm_B (0:54):
- scope (wasm-expression-stack):
{"0":1}
- scope (local):
{"var0":2}
{"$var0":2}
- scope (module):
-- skipped
at (anonymous) (0:17):
......@@ -138,7 +138,7 @@ at wasm_B (0:56):
- scope (wasm-expression-stack):
{}
- scope (local):
{"var0":1}
{"$var0":1}
- scope (module):
-- skipped
at (anonymous) (0:17):
......@@ -157,7 +157,7 @@ at wasm_B (0:56):
- scope (wasm-expression-stack):
{}
- scope (local):
{"var0":1}
{"$var0":1}
- scope (module):
-- skipped
at (anonymous) (0:17):
......@@ -169,7 +169,7 @@ at wasm_B (0:58):
- scope (wasm-expression-stack):
{}
- scope (local):
{"var0":1}
{"$var0":1}
- scope (module):
-- skipped
at (anonymous) (0:17):
......@@ -181,7 +181,7 @@ at wasm_B (0:45):
- scope (wasm-expression-stack):
{}
- scope (local):
{"var0":1}
{"$var0":1}
- scope (module):
-- skipped
at (anonymous) (0:17):
......@@ -193,7 +193,7 @@ at wasm_B (0:47):
- scope (wasm-expression-stack):
{"0":1}
- scope (local):
{"var0":1}
{"$var0":1}
- scope (module):
-- skipped
at (anonymous) (0:17):
......@@ -205,7 +205,7 @@ at wasm_B (0:49):
- scope (wasm-expression-stack):
{}
- scope (local):
{"var0":1}
{"$var0":1}
- scope (module):
-- skipped
at (anonymous) (0:17):
......@@ -217,7 +217,7 @@ at wasm_B (0:51):
- scope (wasm-expression-stack):
{"0":1}
- scope (local):
{"var0":1}
{"$var0":1}
- scope (module):
-- skipped
at (anonymous) (0:17):
......@@ -229,7 +229,7 @@ at wasm_B (0:53):
- scope (wasm-expression-stack):
{"0":1,"1":1}
- scope (local):
{"var0":1}
{"$var0":1}
- scope (module):
-- skipped
at (anonymous) (0:17):
......@@ -241,7 +241,7 @@ at wasm_B (0:54):
- scope (wasm-expression-stack):
{"0":0}
- scope (local):
{"var0":1}
{"$var0":1}
- scope (module):
-- skipped
at (anonymous) (0:17):
......@@ -253,7 +253,7 @@ at wasm_B (0:56):
- scope (wasm-expression-stack):
{}
- scope (local):
{"var0":0}
{"$var0":0}
- scope (module):
-- skipped
at (anonymous) (0:17):
......@@ -272,7 +272,7 @@ at wasm_B (0:56):
- scope (wasm-expression-stack):
{}
- scope (local):
{"var0":0}
{"$var0":0}
- scope (module):
-- skipped
at (anonymous) (0:17):
......@@ -291,7 +291,7 @@ at wasm_B (0:56):
- scope (wasm-expression-stack):
{}
- scope (local):
{"var0":0}
{"$var0":0}
- scope (module):
-- skipped
at (anonymous) (0:17):
......@@ -310,7 +310,7 @@ at wasm_B (0:56):
- scope (wasm-expression-stack):
{}
- scope (local):
{"var0":0}
{"$var0":0}
- scope (module):
-- skipped
at (anonymous) (0:17):
......@@ -322,7 +322,7 @@ at wasm_B (0:58):
- scope (wasm-expression-stack):
{}
- scope (local):
{"var0":0}
{"$var0":0}
- scope (module):
-- skipped
at (anonymous) (0:17):
......
......@@ -91,14 +91,15 @@ async function waitForPauseAndStep(stepAction) {
if (scope.type === 'global' || scope.type === 'module') {
InspectorTest.logObject(' -- skipped');
} else {
const {result: {result: {value}}} =
await Protocol.Runtime.callFunctionOn({
objectId: scope.object.objectId,
functionDeclaration: 'function() { return this; }',
returnByValue: true
const object = {};
const {result: {result: properties}} =
await Protocol.Runtime.getProperties({
objectId: scope.object.objectId
});
InspectorTest.log(` ${JSON.stringify(value)}`);
for (const {name, value: {value}} of properties) {
object[name] = value;
}
InspectorTest.log(` ${JSON.stringify(object)}`);
}
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment