Index: runtime/vm/object.cc |
=================================================================== |
--- runtime/vm/object.cc (revision 19094) |
+++ runtime/vm/object.cc (working copy) |
@@ -12823,18 +12823,39 @@ |
} |
+void Stacktrace::SetFunctionAtFrame(intptr_t frame_index, |
+ const Function& func) const { |
+ const Array& function_array = Array::Handle(raw_ptr()->function_array_); |
+ function_array.SetAt(frame_index, func); |
+} |
+ |
+ |
RawCode* Stacktrace::CodeAtFrame(intptr_t frame_index) const { |
const Array& code_array = Array::Handle(raw_ptr()->code_array_); |
return reinterpret_cast<RawCode*>(code_array.At(frame_index)); |
} |
+void Stacktrace::SetCodeAtFrame(intptr_t frame_index, |
+ const Code& code) const { |
+ const Array& code_array = Array::Handle(raw_ptr()->code_array_); |
+ code_array.SetAt(frame_index, code); |
+} |
+ |
+ |
RawSmi* Stacktrace::PcOffsetAtFrame(intptr_t frame_index) const { |
const Array& pc_offset_array = Array::Handle(raw_ptr()->pc_offset_array_); |
return reinterpret_cast<RawSmi*>(pc_offset_array.At(frame_index)); |
} |
+void Stacktrace::SetPcOffsetAtFrame(intptr_t frame_index, |
+ const Smi& pc_offset) const { |
+ const Array& pc_offset_array = Array::Handle(raw_ptr()->pc_offset_array_); |
+ pc_offset_array.SetAt(frame_index, pc_offset); |
+} |
+ |
+ |
void Stacktrace::set_function_array(const Array& function_array) const { |
StorePointer(&raw_ptr()->function_array_, function_array.raw()); |
} |
@@ -12850,9 +12871,9 @@ |
} |
-RawStacktrace* Stacktrace::New(const GrowableObjectArray& func_list, |
- const GrowableObjectArray& code_list, |
- const GrowableObjectArray& pc_offset_list, |
+RawStacktrace* Stacktrace::New(const Array& func_array, |
+ const Array& code_array, |
+ const Array& pc_offset_array, |
Heap::Space space) { |
ASSERT(Isolate::Current()->object_store()->stacktrace_class() != |
Class::null()); |
@@ -12864,21 +12885,16 @@ |
NoGCScope no_gc; |
result ^= raw; |
} |
- // Create arrays for the function, code and pc_offset triplet for each frame. |
- const Array& function_array = Array::Handle(Array::MakeArray(func_list)); |
- const Array& code_array = Array::Handle(Array::MakeArray(code_list)); |
- const Array& pc_offset_array = |
- Array::Handle(Array::MakeArray(pc_offset_list)); |
- result.set_function_array(function_array); |
+ result.set_function_array(func_array); |
result.set_code_array(code_array); |
result.set_pc_offset_array(pc_offset_array); |
return result.raw(); |
} |
-void Stacktrace::Append(const GrowableObjectArray& func_list, |
- const GrowableObjectArray& code_list, |
- const GrowableObjectArray& pc_offset_list) const { |
+void Stacktrace::Append(const Array& func_list, |
+ const Array& code_list, |
+ const Array& pc_offset_list) const { |
intptr_t old_length = Length(); |
intptr_t new_length = old_length + pc_offset_list.Length(); |
ASSERT(pc_offset_list.Length() == func_list.Length()); |
@@ -12910,6 +12926,7 @@ |
const char* Stacktrace::ToCString() const { |
+ Isolate* isolate = Isolate::Current(); |
Function& function = Function::Handle(); |
Code& code = Code::Handle(); |
Script& script = Script::Handle(); |
@@ -12921,8 +12938,21 @@ |
intptr_t total_len = 0; |
const char* kFormat = "#%-6d %s (%s:%d:%d)\n"; |
GrowableArray<char*> frame_strings; |
+ char* chars; |
for (intptr_t i = 0; i < Length(); i++) { |
function = FunctionAtFrame(i); |
+ if (function.IsNull()) { |
+ // Check if null function object indicates a stack trace overflow. |
+ if ((i < (Length() - 1)) && |
+ (FunctionAtFrame(i + 1) != Function::null())) { |
+ const char* kTruncated = "...\n...\n"; |
+ intptr_t truncated_len = strlen(kTruncated) + 1; |
+ chars = isolate->current_zone()->Alloc<char>(truncated_len); |
+ OS::SNPrint(chars, truncated_len, "%s", kTruncated); |
+ frame_strings.Add(chars); |
+ } |
+ continue; |
+ } |
code = CodeAtFrame(i); |
uword pc = code.EntryPoint() + Smi::Value(PcOffsetAtFrame(i)); |
intptr_t token_pos = code.GetTokenIndexOfPC(pc); |
@@ -12940,7 +12970,7 @@ |
url.ToCString(), |
line, column); |
total_len += len; |
- char* chars = Isolate::Current()->current_zone()->Alloc<char>(len + 1); |
+ chars = isolate->current_zone()->Alloc<char>(len + 1); |
OS::SNPrint(chars, (len + 1), kFormat, |
i, |
function_name.ToCString(), |
@@ -12950,7 +12980,7 @@ |
} |
// Now concatentate the frame descriptions into a single C string. |
- char* chars = Isolate::Current()->current_zone()->Alloc<char>(total_len + 1); |
+ chars = isolate->current_zone()->Alloc<char>(total_len + 1); |
intptr_t index = 0; |
for (intptr_t i = 0; i < frame_strings.length(); i++) { |
index += OS::SNPrint((chars + index), |