Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(164)

Unified Diff: src/runtime/runtime-debug.cc

Issue 2109093003: [wasm] Enable wasm frame inspection for debugging (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/objects.cc ('k') | src/runtime/runtime-liveedit.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/runtime/runtime-debug.cc
diff --git a/src/runtime/runtime-debug.cc b/src/runtime/runtime-debug.cc
index 53a588c7846a9003c689f090a054191d4c9e38e6..c65330c553e870fcaffdcb3611d0180484e041f3 100644
--- a/src/runtime/runtime-debug.cc
+++ b/src/runtime/runtime-debug.cc
@@ -14,6 +14,7 @@
#include "src/interpreter/interpreter.h"
#include "src/isolate-inl.h"
#include "src/runtime/runtime.h"
+#include "src/wasm/wasm-module.h"
namespace v8 {
namespace internal {
@@ -453,12 +454,16 @@ RUNTIME_FUNCTION(Runtime_GetFrameCount) {
return Smi::FromInt(0);
}
- for (JavaScriptFrameIterator it(isolate, id); !it.done(); it.Advance()) {
+ for (StackTraceFrameIterator it(isolate, id); !it.done(); it.Advance()) {
List<FrameSummary> frames(FLAG_max_inlining_levels + 1);
- it.frame()->Summarize(&frames);
- for (int i = frames.length() - 1; i >= 0; i--) {
- // Omit functions from native and extension scripts.
- if (frames[i].function()->shared()->IsSubjectToDebugging()) n++;
+ if (it.is_wasm()) {
+ n++;
+ } else {
+ it.javascript_frame()->Summarize(&frames);
+ for (int i = frames.length() - 1; i >= 0; i--) {
+ // Omit functions from native and extension scripts.
+ if (frames[i].function()->shared()->IsSubjectToDebugging()) n++;
+ }
}
}
return Smi::FromInt(n);
@@ -468,14 +473,14 @@ RUNTIME_FUNCTION(Runtime_GetFrameCount) {
static const int kFrameDetailsFrameIdIndex = 0;
static const int kFrameDetailsReceiverIndex = 1;
static const int kFrameDetailsFunctionIndex = 2;
-static const int kFrameDetailsArgumentCountIndex = 3;
-static const int kFrameDetailsLocalCountIndex = 4;
-static const int kFrameDetailsSourcePositionIndex = 5;
-static const int kFrameDetailsConstructCallIndex = 6;
-static const int kFrameDetailsAtReturnIndex = 7;
-static const int kFrameDetailsFlagsIndex = 8;
-static const int kFrameDetailsFirstDynamicIndex = 9;
-
+static const int kFrameDetailsScriptIndex = 3;
+static const int kFrameDetailsArgumentCountIndex = 4;
+static const int kFrameDetailsLocalCountIndex = 5;
+static const int kFrameDetailsSourcePositionIndex = 6;
+static const int kFrameDetailsConstructCallIndex = 7;
+static const int kFrameDetailsAtReturnIndex = 8;
+static const int kFrameDetailsFlagsIndex = 9;
+static const int kFrameDetailsFirstDynamicIndex = 10;
// Return an array with frame details
// args[0]: number: break id
@@ -485,12 +490,13 @@ static const int kFrameDetailsFirstDynamicIndex = 9;
// 0: Frame id
// 1: Receiver
// 2: Function
-// 3: Argument count
-// 4: Local count
-// 5: Source position
-// 6: Constructor call
-// 7: Is at return
-// 8: Flags
+// 3: Script
+// 4: Argument count
+// 5: Local count
+// 6: Source position
+// 7: Constructor call
+// 8: Is at return
+// 9: Flags
// Arguments name, value
// Locals name, value
// Return value if any
@@ -510,14 +516,13 @@ RUNTIME_FUNCTION(Runtime_GetFrameDetails) {
return heap->undefined_value();
}
- JavaScriptFrameIterator it(isolate, id);
+ StackTraceFrameIterator it(isolate, id);
// Inlined frame index in optimized frame, starting from outer function.
int inlined_jsframe_index =
DebugFrameHelper::FindIndexedNonNativeFrame(&it, index);
if (inlined_jsframe_index == -1) return heap->undefined_value();
FrameInspector frame_inspector(it.frame(), inlined_jsframe_index, isolate);
- bool is_optimized = it.frame()->is_optimized();
// Traverse the saved contexts chain to find the active context for the
// selected frame.
@@ -531,6 +536,59 @@ RUNTIME_FUNCTION(Runtime_GetFrameDetails) {
// Find source position in unoptimized code.
int position = frame_inspector.GetSourcePosition();
+ if (it.is_wasm()) {
+ // Create the details array (no dynamic information for wasm).
+ Handle<FixedArray> details =
+ isolate->factory()->NewFixedArray(kFrameDetailsFirstDynamicIndex);
+
+ // Add the frame id.
+ details->set(kFrameDetailsFrameIdIndex, *frame_id);
+
+ // Add the function name.
+ Handle<Object> wasm_obj(it.wasm_frame()->wasm_obj(), isolate);
+ int func_index = it.wasm_frame()->function_index();
+ Handle<String> func_name =
+ wasm::GetWasmFunctionName(isolate, wasm_obj, func_index);
+ details->set(kFrameDetailsFunctionIndex, *func_name);
+
+ // Add the script wrapper
+ Handle<Object> script_wrapper =
+ Script::GetWrapper(frame_inspector.GetScript());
+ details->set(kFrameDetailsScriptIndex, *script_wrapper);
+
+ // Add the arguments count.
+ details->set(kFrameDetailsArgumentCountIndex, Smi::FromInt(0));
+
+ // Add the locals count
+ details->set(kFrameDetailsLocalCountIndex, Smi::FromInt(0));
+
+ // Add the source position.
+ if (position != RelocInfo::kNoPosition) {
+ details->set(kFrameDetailsSourcePositionIndex, Smi::FromInt(position));
+ }
+
+ // Add the constructor information.
+ details->set(kFrameDetailsConstructCallIndex, heap->ToBoolean(false));
+
+ // Add the at return information.
+ details->set(kFrameDetailsAtReturnIndex, heap->ToBoolean(false));
+
+ // Add flags to indicate information on whether this frame is
+ // bit 0: invoked in the debugger context.
+ // bit 1: optimized frame.
+ // bit 2: inlined in optimized frame
+ int flags = 0;
+ if (*save->context() == *isolate->debug()->debug_context()) {
+ flags |= 1 << 0;
+ }
+ details->set(kFrameDetailsFlagsIndex, Smi::FromInt(flags));
+
+ return *isolate->factory()->NewJSArrayWithElements(details);
+ }
+
+ // Handle JavaScript frames.
+ bool is_optimized = it.frame()->is_optimized();
+
// Check for constructor frame.
bool constructor = frame_inspector.IsConstructor();
@@ -595,7 +653,7 @@ RUNTIME_FUNCTION(Runtime_GetFrameDetails) {
// frame or if the frame is optimized it cannot be at a return.
bool at_return = false;
if (!is_optimized && index == 0) {
- at_return = isolate->debug()->IsBreakAtReturn(it.frame());
+ at_return = isolate->debug()->IsBreakAtReturn(it.javascript_frame());
}
// If positioned just before return find the value to be returned and add it
@@ -609,7 +667,8 @@ RUNTIME_FUNCTION(Runtime_GetFrameDetails) {
// the provided parameters whereas the function frame always have the number
// of arguments matching the functions parameters. The rest of the
// information (except for what is collected above) is the same.
- if ((inlined_jsframe_index == 0) && it.frame()->has_adapted_arguments()) {
+ if ((inlined_jsframe_index == 0) &&
+ it.javascript_frame()->has_adapted_arguments()) {
it.AdvanceToArgumentsFrame();
frame_inspector.SetArgumentsFrame(it.frame());
}
@@ -632,6 +691,11 @@ RUNTIME_FUNCTION(Runtime_GetFrameDetails) {
// Add the function (same as in function frame).
details->set(kFrameDetailsFunctionIndex, *(frame_inspector.GetFunction()));
+ // Add the script wrapper
+ Handle<Object> script_wrapper =
+ Script::GetWrapper(frame_inspector.GetScript());
+ details->set(kFrameDetailsScriptIndex, *script_wrapper);
+
// Add the arguments count.
details->set(kFrameDetailsArgumentCountIndex, Smi::FromInt(argument_count));
@@ -795,8 +859,8 @@ RUNTIME_FUNCTION(Runtime_GetAllScopesDetails) {
// Get the frame where the debugging is performed.
StackFrame::Id id = DebugFrameHelper::UnwrapFrameId(wrapped_id);
- JavaScriptFrameIterator frame_it(isolate, id);
- JavaScriptFrame* frame = frame_it.frame();
+ StackTraceFrameIterator frame_it(isolate, id);
+ StandardFrame* frame = frame_it.frame();
FrameInspector frame_inspector(frame, inlined_jsframe_index, isolate);
List<Handle<JSObject> > result(4);
@@ -1517,8 +1581,10 @@ static Handle<Object> GetJSPositionInfo(Handle<Script> script, int position,
}
Handle<String> source = handle(String::cast(script->source()), isolate);
- Handle<String> sourceText =
- isolate->factory()->NewSubString(source, info.line_start, info.line_end);
+ Handle<String> sourceText = script->type() == Script::TYPE_WASM
+ ? isolate->factory()->empty_string()
+ : isolate->factory()->NewSubString(
+ source, info.line_start, info.line_end);
Handle<JSObject> jsinfo =
isolate->factory()->NewJSObject(isolate->object_function());
« no previous file with comments | « src/objects.cc ('k') | src/runtime/runtime-liveedit.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698