| Index: runtime/vm/object.cc
|
| ===================================================================
|
| --- runtime/vm/object.cc (revision 19025)
|
| +++ runtime/vm/object.cc (working copy)
|
| @@ -133,6 +133,7 @@
|
| V(CoreLibrary, NoSuchMethodError, _throwNew) \
|
| V(CoreLibrary, int, _throwFormatException) \
|
| V(CoreLibrary, int, _parse) \
|
| + V(CoreLibrary, Stacktrace, _setupFullStacktrace) \
|
|
|
|
|
| static void MarkFunctionAsInvisible(const Library& lib,
|
| @@ -12850,9 +12851,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());
|
| @@ -12865,11 +12866,7 @@
|
| 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();
|
| @@ -12909,6 +12906,28 @@
|
| }
|
|
|
|
|
| +void Stacktrace::SetCatchStacktrace(const Array& func_array,
|
| + const Array& code_array,
|
| + const Array& pc_offset_array) const {
|
| + StorePointer(&raw_ptr()->catch_func_array_, func_array.raw());
|
| + StorePointer(&raw_ptr()->catch_code_array_, code_array.raw());
|
| + StorePointer(&raw_ptr()->catch_pc_offset_array_, pc_offset_array.raw());
|
| +}
|
| +
|
| +
|
| +RawString* Stacktrace::FullStacktrace() const {
|
| + const Array& func_array = Array::Handle(raw_ptr()->catch_func_array_);
|
| + const Array& code_array = Array::Handle(raw_ptr()->catch_code_array_);
|
| + const Array& pc_offset_array =
|
| + Array::Handle(raw_ptr()->catch_pc_offset_array_);
|
| + const Stacktrace& catch_trace = Stacktrace::Handle(
|
| + Stacktrace::New(func_array, code_array, pc_offset_array));
|
| + const String& trace = String::Handle(String::New(catch_trace.ToCString()));
|
| + const String& throw_trace = String::Handle(String::New(ToCString()));
|
| + return String::Concat(throw_trace, trace);
|
| +}
|
| +
|
| +
|
| const char* Stacktrace::ToCString() const {
|
| Function& function = Function::Handle();
|
| Code& code = Code::Handle();
|
|
|