| Index: runtime/vm/exceptions.cc
|
| ===================================================================
|
| --- runtime/vm/exceptions.cc (revision 16999)
|
| +++ runtime/vm/exceptions.cc (working copy)
|
| @@ -42,12 +42,31 @@
|
| Smi& offset = Smi::Handle();
|
| while (!frame->IsEntryFrame()) {
|
| if (frame->IsDartFrame()) {
|
| - func = frame->LookupDartFunction();
|
| code = frame->LookupDartCode();
|
| - offset = Smi::New(frame->pc() - code.EntryPoint());
|
| - func_list.Add(func);
|
| - code_list.Add(code);
|
| - pc_offset_list.Add(offset);
|
| + if (code.is_optimized()) {
|
| + // For optimized frames, extract all the inlined functions if any
|
| + // into the stack trace.
|
| + InlinedFunctionsInDartFrameIterator optimized_frames(frame);
|
| + while (true) {
|
| + uword pc = 0;
|
| + func = optimized_frames.GetNextFunction(&pc);
|
| + if (func.IsNull()) {
|
| + break;
|
| + }
|
| + ASSERT(pc != 0);
|
| + code = func.unoptimized_code();
|
| + offset = Smi::New(pc - code.EntryPoint());
|
| + func_list.Add(func);
|
| + code_list.Add(code);
|
| + pc_offset_list.Add(offset);
|
| + }
|
| + } else {
|
| + offset = Smi::New(frame->pc() - code.EntryPoint());
|
| + func = code.function();
|
| + func_list.Add(func);
|
| + code_list.Add(code);
|
| + pc_offset_list.Add(offset);
|
| + }
|
| if (frame->FindExceptionHandler(handler_pc)) {
|
| *handler_sp = frame->sp();
|
| *handler_fp = frame->fp();
|
|
|