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 |