Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(128)

Unified Diff: runtime/vm/object.cc

Issue 12316116: Add functionality to get full stack trace when exceptions are thrown. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();

Powered by Google App Engine
This is Rietveld 408576698