| Index: runtime/vm/debugger.cc
|
| diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
|
| index 940147b5064855b745b67dca379056e0801125af..3aa53abe62f01e51f3eb4a2986f54e2853d68920 100644
|
| --- a/runtime/vm/debugger.cc
|
| +++ b/runtime/vm/debugger.cc
|
| @@ -1271,6 +1271,79 @@ DebuggerStackTrace* Debugger::StackTrace() {
|
| }
|
|
|
|
|
| +ExceptionStackTrace* Debugger::BuildExceptionStackTrace() {
|
| + Isolate* isolate = Isolate::Current();
|
| + ExceptionStackTrace* result = new ExceptionStackTrace(8);
|
| + StackFrameIterator iterator(false);
|
| + Function& function = Function::Handle(isolate);
|
| + Code& code = Code::Handle(isolate);
|
| + Code& inlined_code = Code::Handle(isolate);
|
| +
|
| + String& function_name = String::Handle(isolate);
|
| + String& script_uri = String::Handle(isolate);
|
| + Script& script = Script::Handle(isolate);
|
| +
|
| + for (StackFrame* frame = iterator.NextFrame();
|
| + frame != NULL;
|
| + frame = iterator.NextFrame()) {
|
| + ASSERT(frame->IsValid());
|
| + if (frame->IsEntryFrame()) {
|
| + } else if (frame->IsDartFrame()) {
|
| + code = frame->LookupDartCode();
|
| + if (code.is_optimized()) {
|
| + for (InlinedFunctionsIterator it(code, frame->pc());
|
| + !it.Done();
|
| + it.Advance()) {
|
| + function = it.function();
|
| + inlined_code = it.code();
|
| + uword pc = it.pc();
|
| +
|
| + if (!function.is_visible()) continue;
|
| +
|
| + function_name = function.QualifiedUserVisibleName();
|
| + script = function.script();
|
| + script_uri = script.url();
|
| + const intptr_t token_pos = inlined_code.GetTokenIndexOfPC(pc);
|
| + intptr_t line = -1;
|
| + intptr_t column = -1;
|
| + if (token_pos >= 0) {
|
| + if (script.HasSource()) {
|
| + script.GetTokenLocation(token_pos, &line, &column);
|
| + } else {
|
| + script.GetTokenLocation(token_pos, &line, NULL);
|
| + }
|
| + }
|
| + result->AddFrame(
|
| + new ExceptionStackFrame(function_name, script_uri, line, column));
|
| + }
|
| + } else {
|
| + function = frame->LookupDartFunction();
|
| + uword pc = frame->pc();
|
| +
|
| + if (!function.is_visible()) continue;
|
| +
|
| + function_name = function.QualifiedUserVisibleName();
|
| + script = function.script();
|
| + script_uri = script.url();
|
| + const intptr_t token_pos = code.GetTokenIndexOfPC(pc);
|
| + intptr_t line = -1;
|
| + intptr_t column = -1;
|
| + if (token_pos >= 0) {
|
| + if (script.HasSource()) {
|
| + script.GetTokenLocation(token_pos, &line, &column);
|
| + } else {
|
| + script.GetTokenLocation(token_pos, &line, NULL);
|
| + }
|
| + }
|
| + result->AddFrame(
|
| + new ExceptionStackFrame(function_name, script_uri, line, column));
|
| + }
|
| + }
|
| + }
|
| + return result;
|
| +}
|
| +
|
| +
|
| void Debugger::SetExceptionPauseInfo(Dart_ExceptionPauseInfo pause_info) {
|
| ASSERT((pause_info == kNoPauseOnExceptions) ||
|
| (pause_info == kPauseOnUnhandledExceptions) ||
|
|
|