OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/bootstrap_natives.h" | 5 #include "vm/bootstrap_natives.h" |
6 #include "vm/exceptions.h" | 6 #include "vm/exceptions.h" |
7 #include "vm/object_store.h" | 7 #include "vm/object_store.h" |
8 #include "vm/runtime_entry.h" | 8 #include "vm/runtime_entry.h" |
9 #include "vm/stack_frame.h" | 9 #include "vm/stack_frame.h" |
10 | 10 |
(...skipping 20 matching lines...) Expand all Loading... |
31 } | 31 } |
32 | 32 |
33 | 33 |
34 static void IterateFrames(const GrowableObjectArray& code_list, | 34 static void IterateFrames(const GrowableObjectArray& code_list, |
35 const GrowableObjectArray& pc_offset_list) { | 35 const GrowableObjectArray& pc_offset_list) { |
36 StackFrameIterator frames(StackFrameIterator::kDontValidateFrames); | 36 StackFrameIterator frames(StackFrameIterator::kDontValidateFrames); |
37 StackFrame* frame = frames.NextFrame(); | 37 StackFrame* frame = frames.NextFrame(); |
38 ASSERT(frame != NULL); // We expect to find a dart invocation frame. | 38 ASSERT(frame != NULL); // We expect to find a dart invocation frame. |
39 Code& code = Code::Handle(); | 39 Code& code = Code::Handle(); |
40 Smi& offset = Smi::Handle(); | 40 Smi& offset = Smi::Handle(); |
41 bool catch_frame_skipped = false; // Tracks if catch frame has been skipped. | 41 intptr_t frames_to_skip = 2; // _setupFullStackTrace and the catch frame. |
42 while (frame != NULL) { | 42 while (frame != NULL) { |
43 if (frame->IsDartFrame()) { | 43 if (frame->IsDartFrame()) { |
44 code = frame->LookupDartCode(); | 44 code = frame->LookupDartCode(); |
45 offset = Smi::New(frame->pc() - code.EntryPoint()); | 45 offset = Smi::New(frame->pc() - code.EntryPoint()); |
46 if (!catch_frame_skipped) { | 46 if (frames_to_skip > 0) { |
47 const Function& func = Function::Handle(code.function()); | 47 frames_to_skip--; |
48 // Skip over hidden native, and mark first visible frame as catch frame. | |
49 if (func.is_visible()) { | |
50 catch_frame_skipped = true; | |
51 } | |
52 } else { | 48 } else { |
53 code_list.Add(code); | 49 code_list.Add(code); |
54 pc_offset_list.Add(offset); | 50 pc_offset_list.Add(offset); |
55 } | 51 } |
56 } | 52 } |
57 frame = frames.NextFrame(); | 53 frame = frames.NextFrame(); |
58 } | 54 } |
59 } | 55 } |
60 | 56 |
61 | 57 |
(...skipping 29 matching lines...) Expand all Loading... |
91 IterateFrames(code_list, pc_offset_list); | 87 IterateFrames(code_list, pc_offset_list); |
92 const Array& code_array = Array::Handle(Array::MakeArray(code_list)); | 88 const Array& code_array = Array::Handle(Array::MakeArray(code_list)); |
93 const Array& pc_offset_array = | 89 const Array& pc_offset_array = |
94 Array::Handle(Array::MakeArray(pc_offset_list)); | 90 Array::Handle(Array::MakeArray(pc_offset_list)); |
95 const Stacktrace& stacktrace = Stacktrace::Handle( | 91 const Stacktrace& stacktrace = Stacktrace::Handle( |
96 Stacktrace::New(code_array, pc_offset_array)); | 92 Stacktrace::New(code_array, pc_offset_array)); |
97 OS::Print("%s\n", stacktrace.ToCString()); | 93 OS::Print("%s\n", stacktrace.ToCString()); |
98 } | 94 } |
99 | 95 |
100 } // namespace dart | 96 } // namespace dart |
OLD | NEW |