Chromium Code Reviews| Index: runtime/lib/stacktrace.cc |
| diff --git a/runtime/lib/stacktrace.cc b/runtime/lib/stacktrace.cc |
| index 6175b24b4d18d841ce132233347e27e3053439a3..e2ebe9ff62c62089b9a108c9428d7fd73a60e9d3 100644 |
| --- a/runtime/lib/stacktrace.cc |
| +++ b/runtime/lib/stacktrace.cc |
| @@ -11,7 +11,8 @@ |
| namespace dart { |
| static void IterateFrames(const GrowableObjectArray& code_list, |
| - const GrowableObjectArray& pc_offset_list) { |
| + const GrowableObjectArray& pc_offset_list, |
| + int skip_frames) { |
| StackFrameIterator frames(StackFrameIterator::kDontValidateFrames); |
| StackFrame* frame = frames.NextFrame(); |
| ASSERT(frame != NULL); // We expect to find a dart invocation frame. |
| @@ -19,10 +20,14 @@ static void IterateFrames(const GrowableObjectArray& code_list, |
| Smi& offset = Smi::Handle(); |
| while (frame != NULL) { |
| if (frame->IsDartFrame()) { |
| - code = frame->LookupDartCode(); |
| - offset = Smi::New(frame->pc() - code.EntryPoint()); |
| - code_list.Add(code); |
| - pc_offset_list.Add(offset); |
| + if (skip_frames > 0) { |
| + skip_frames--; |
| + } else { |
| + code = frame->LookupDartCode(); |
| + offset = Smi::New(frame->pc() - code.EntryPoint()); |
| + code_list.Add(code); |
| + pc_offset_list.Add(offset); |
| + } |
| } |
| frame = frames.NextFrame(); |
| } |
| @@ -39,7 +44,7 @@ void _printCurrentStacktrace() { |
| GrowableObjectArray::Handle(GrowableObjectArray::New()); |
| const GrowableObjectArray& pc_offset_list = |
| GrowableObjectArray::Handle(GrowableObjectArray::New()); |
| - IterateFrames(code_list, pc_offset_list); |
| + IterateFrames(code_list, pc_offset_list, 0); |
| const Array& code_array = Array::Handle(Array::MakeArray(code_list)); |
| const Array& pc_offset_array = |
| Array::Handle(Array::MakeArray(pc_offset_list)); |
| @@ -48,4 +53,20 @@ void _printCurrentStacktrace() { |
| OS::PrintErr("=== Current Trace:\n%s===\n", stacktrace.ToCString()); |
| } |
| +DEFINE_NATIVE_ENTRY(StackTrace_current, 0) { |
| + const GrowableObjectArray& code_list = |
|
Ivan Posva
2015/11/24 00:53:58
This whole code needs to be de-deduplicated: https
Lasse Reichstein Nielsen
2015/11/24 06:52:56
I'll start by moving it to a static function in th
|
| + GrowableObjectArray::Handle(GrowableObjectArray::New()); |
| + const GrowableObjectArray& pc_offset_list = |
| + GrowableObjectArray::Handle(GrowableObjectArray::New()); |
| + // Skip the StackFrame.current frame. |
| + IterateFrames(code_list, pc_offset_list, 1); |
| + const Array& code_array = Array::Handle(Array::MakeArray(code_list)); |
| + const Array& pc_offset_array = |
| + Array::Handle(Array::MakeArray(pc_offset_list)); |
| + const Stacktrace& stacktrace = Stacktrace::Handle( |
| + Stacktrace::New(code_array, pc_offset_array)); |
| + return stacktrace.raw(); |
| +} |
| + |
| + |
| } // namespace dart |