@@ -18,25 +18,35 @@ DECLARE_FLAG(bool, show_invisible_frames);
1818
1919static const intptr_t kDefaultStackAllocation = 8 ;
2020
21+ static StackTracePtr CreateStackTraceObject (
22+ Zone* zone,
23+ const GrowableObjectArray& code_list,
24+ const GrowableArray<uword>& pc_offset_list) {
25+ const auto & code_array =
26+ Array::Handle (zone, Array::MakeFixedLength (code_list));
27+ const auto & pc_offset_array = TypedData::Handle (
28+ zone, TypedData::New (kUintPtrCid , pc_offset_list.length ()));
29+ {
30+ NoSafepointScope no_safepoint;
31+ memmove (pc_offset_array.DataAddr (0 ), pc_offset_list.data (),
32+ pc_offset_list.length () * kWordSize );
33+ }
34+ return StackTrace::New (code_array, pc_offset_array);
35+ }
36+
2137static StackTracePtr CurrentSyncStackTraceLazy (Thread* thread,
2238 intptr_t skip_frames = 1 ) {
2339 Zone* zone = thread->zone ();
2440
2541 const auto & code_array = GrowableObjectArray::ZoneHandle (
2642 zone, GrowableObjectArray::New (kDefaultStackAllocation ));
27- const auto & pc_offset_array = GrowableObjectArray::ZoneHandle (
28- zone, GrowableObjectArray::New (kDefaultStackAllocation ));
43+ GrowableArray<uword> pc_offset_array;
2944
3045 // Collect the frames.
31- StackTraceUtils::CollectFramesLazy (thread, code_array, pc_offset_array,
46+ StackTraceUtils::CollectFramesLazy (thread, code_array, & pc_offset_array,
3247 skip_frames);
3348
34- const auto & code_array_fixed =
35- Array::Handle (zone, Array::MakeFixedLength (code_array));
36- const auto & pc_offset_array_fixed =
37- Array::Handle (zone, Array::MakeFixedLength (pc_offset_array));
38-
39- return StackTrace::New (code_array_fixed, pc_offset_array_fixed);
49+ return CreateStackTraceObject (zone, code_array, pc_offset_array);
4050}
4151
4252static StackTracePtr CurrentSyncStackTrace (Thread* thread,
@@ -51,8 +61,8 @@ static StackTracePtr CurrentSyncStackTrace(Thread* thread,
5161 // Allocate once.
5262 const Array& code_array =
5363 Array::ZoneHandle (zone, Array::New (stack_trace_length));
54- const Array & pc_offset_array =
55- Array::ZoneHandle ( zone, Array ::New (stack_trace_length));
64+ const TypedData & pc_offset_array = TypedData::ZoneHandle (
65+ zone, TypedData ::New (kUintPtrCid , stack_trace_length));
5666
5767 // Collect the frames.
5868 const intptr_t collected_frames_count = StackTraceUtils::CollectFrames (
@@ -89,7 +99,7 @@ DEFINE_NATIVE_ENTRY(StackTrace_current, 0, 0) {
8999}
90100
91101static void AppendFrames (const GrowableObjectArray& code_list,
92- const GrowableObjectArray& pc_offset_list,
102+ GrowableArray<uword>* pc_offset_list,
93103 int skip_frames) {
94104 Thread* thread = Thread::Current ();
95105 Zone* zone = thread->zone ();
@@ -98,7 +108,6 @@ static void AppendFrames(const GrowableObjectArray& code_list,
98108 StackFrame* frame = frames.NextFrame ();
99109 ASSERT (frame != NULL ); // We expect to find a dart invocation frame.
100110 Code& code = Code::Handle (zone);
101- Smi& offset = Smi::Handle (zone);
102111 for (; frame != NULL ; frame = frames.NextFrame ()) {
103112 if (!frame->IsDartFrame ()) {
104113 continue ;
@@ -109,26 +118,24 @@ static void AppendFrames(const GrowableObjectArray& code_list,
109118 }
110119
111120 code = frame->LookupDartCode ();
112- offset = Smi::New ( frame->pc () - code.PayloadStart () );
121+ const intptr_t pc_offset = frame->pc () - code.PayloadStart ();
113122 code_list.Add (code);
114- pc_offset_list. Add (offset );
123+ pc_offset_list-> Add (pc_offset );
115124 }
116125}
117126
118127// Creates a StackTrace object from the current stack.
119128//
120129// Skips the first skip_frames Dart frames.
121130const StackTrace& GetCurrentStackTrace (int skip_frames) {
131+ Zone* zone = Thread::Current ()->zone ();
122132 const GrowableObjectArray& code_list =
123- GrowableObjectArray::Handle (GrowableObjectArray::New ());
124- const GrowableObjectArray& pc_offset_list =
125- GrowableObjectArray::Handle (GrowableObjectArray::New ());
126- AppendFrames (code_list, pc_offset_list, skip_frames);
127- const Array& code_array = Array::Handle (Array::MakeFixedLength (code_list));
128- const Array& pc_offset_array =
129- Array::Handle (Array::MakeFixedLength (pc_offset_list));
130- const StackTrace& stacktrace =
131- StackTrace::Handle (StackTrace::New (code_array, pc_offset_array));
133+ GrowableObjectArray::Handle (zone, GrowableObjectArray::New ());
134+ GrowableArray<uword> pc_offset_list;
135+ AppendFrames (code_list, &pc_offset_list, skip_frames);
136+
137+ const StackTrace& stacktrace = StackTrace::Handle (
138+ zone, CreateStackTraceObject (zone, code_list, pc_offset_list));
132139 return stacktrace;
133140}
134141
0 commit comments