Index: runtime/vm/exceptions.cc |
=================================================================== |
--- runtime/vm/exceptions.cc (revision 29131) |
+++ runtime/vm/exceptions.cc (working copy) |
@@ -375,7 +375,6 @@ |
// Get stacktrace field of class Error. |
const Field& stacktrace_field = |
Field::Handle(isolate, LookupStacktraceField(exception)); |
- bool full_stacktrace = !stacktrace_field.IsNull(); |
handler_exists = FindExceptionHandler(&handler_pc, |
&handler_sp, |
&handler_fp, |
@@ -383,29 +382,40 @@ |
Array& code_array = Array::Handle(isolate, Object::empty_array().raw()); |
Array& pc_offset_array = |
Array::Handle(isolate, Object::empty_array().raw()); |
- if (handler_needs_stacktrace || full_stacktrace) { |
- RegularStacktraceBuilder frame_builder(full_stacktrace); |
- BuildStackTrace(&frame_builder); |
- |
- // Create arrays for function, code and pc_offset triplet of each frame. |
- code_array = Array::MakeArray(frame_builder.code_list()); |
- pc_offset_array = Array::MakeArray(frame_builder.pc_offset_list()); |
- if (!stacktrace_field.IsNull()) { |
+ // If we have an error with a stacktrace field then collect the full stack |
+ // trace and store it into the field. |
+ if (!stacktrace_field.IsNull()) { |
+ if (exception.GetField(stacktrace_field) == Object::null()) { |
// This is an error object and we need to capture the full stack trace |
// here implicitly, so we set up the stack trace. The stack trace field |
// is set only once, it is not overriden. |
- const Array& catch_code_array = Array::Handle(isolate, |
+ RegularStacktraceBuilder frame_builder(true); |
+ BuildStackTrace(&frame_builder); |
+ |
+ // Create arrays for code and pc_offset tuples of each frame. |
+ const Array& full_code_array = Array::Handle(isolate, |
+ Array::MakeArray(frame_builder.code_list())); |
+ const Array& full_pc_offset_array = Array::Handle(isolate, |
+ Array::MakeArray(frame_builder.pc_offset_list())); |
+ const Array& full_catch_code_array = Array::Handle(isolate, |
Array::MakeArray(frame_builder.catch_code_list())); |
- const Array& catch_pc_offset_array = Array::Handle(isolate, |
+ const Array& full_catch_pc_offset_array = Array::Handle(isolate, |
Array::MakeArray(frame_builder.catch_pc_offset_list())); |
- stacktrace = Stacktrace::New(code_array, pc_offset_array); |
- stacktrace.SetCatchStacktrace(catch_code_array, |
- catch_pc_offset_array); |
- if (exception.GetField(stacktrace_field) == Object::null()) { |
- exception.SetField(stacktrace_field, stacktrace); |
- } |
- } // if stacktrace needed. |
+ const Stacktrace& full_stacktrace = Stacktrace::Handle(isolate, |
+ Stacktrace::New(full_code_array, full_pc_offset_array)); |
+ full_stacktrace.SetCatchStacktrace(full_catch_code_array, |
+ full_catch_pc_offset_array); |
+ exception.SetField(stacktrace_field, full_stacktrace); |
+ } |
} |
+ if (handler_needs_stacktrace) { |
+ RegularStacktraceBuilder frame_builder(false); |
+ BuildStackTrace(&frame_builder); |
+ |
+ // Create arrays for fcode and pc_offset tuples of each frame. |
siva
2013/10/24 00:16:10
for code and pc_offset
Ivan Posva
2013/10/24 00:16:41
Done.
|
+ code_array = Array::MakeArray(frame_builder.code_list()); |
+ pc_offset_array = Array::MakeArray(frame_builder.pc_offset_list()); |
+ } |
if (existing_stacktrace.IsNull()) { |
stacktrace = Stacktrace::New(code_array, pc_offset_array); |
} else { |