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()); |