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

Unified Diff: runtime/vm/dart_api_impl.cc

Issue 51793002: Add an API function to get a debugger stack trace from an error handle. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 2 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/dart_api_impl.cc
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 32fc7bfa6c8ff835d0b6b9b0d5a27cfe12b1aa3f..33be4857eaebbdfa549eefd6adaa96f39a9e0c50 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -387,6 +387,70 @@ DART_EXPORT Dart_Handle Dart_ErrorGetStacktrace(Dart_Handle handle) {
}
}
+DART_EXPORT Dart_Handle Dart_StacktraceLength(Dart_Handle handle,
+ intptr_t* length) {
+ Isolate* isolate = Isolate::Current();
+ DARTSCOPE(isolate);
+ const Object& obj = Object::Handle(isolate, Api::UnwrapHandle(handle));
+ if (obj.IsStacktrace()) {
+ const Stacktrace& stacktrace = Stacktrace::Cast(obj);
+ if (length != NULL) {
+ *length = stacktrace.VisibleLength();
+ }
+ return Api::Success();
+ } else {
+ return Api::NewError(
+ "%s expects argument 'handle' to be a stacktrace handle.",
+ CURRENT_FUNC);
+ }
+}
+
+DART_EXPORT Dart_Handle Dart_StacktraceFrameInfo(
+ Dart_Handle handle,
+ intptr_t frame_index,
+ Dart_Handle* function_name,
+ Dart_Handle* script_url,
+ intptr_t* line_number,
+ intptr_t* col_number) {
+ Isolate* isolate = Isolate::Current();
+ DARTSCOPE(isolate);
+ Object& obj = Object::Handle(isolate, Api::UnwrapHandle(handle));
+ if (obj.IsStacktrace()) {
+ const Stacktrace& stacktrace = Stacktrace::Cast(obj);
+ String& internal_function_name = String::Handle();
+ String& internal_script_url = String::Handle();
+ intptr_t internal_line_number = 0;
+ intptr_t internal_col_num = 0;
+ bool in_bounds = stacktrace.VisibleFrameInfoAt(frame_index,
+ &internal_function_name,
+ &internal_script_url,
+ &internal_line_number,
+ &internal_col_num);
+ if (!in_bounds) {
+ return Api::NewError(
+ "%s: frame index was out of bounds (%" Pd ")",
+ CURRENT_FUNC, frame_index);
+ }
+ if (function_name != NULL) {
+ *function_name = Api::NewHandle(isolate, internal_function_name.raw());
+ }
+ if (script_url != NULL) {
+ *script_url = Api::NewHandle(isolate, internal_script_url.raw());
+ }
+ if (line_number != NULL) {
+ *line_number = internal_line_number;
+ }
+ if (col_number != NULL) {
+ *col_number = internal_col_num;
+ }
+ return Api::Success();
+ } else {
+ return Api::NewError(
+ "%s expects argument 'handle' to be a stacktrace handle.",
+ CURRENT_FUNC);
+ }
+}
+
// TODO(turnidge): This clones Api::NewError. I need to use va_copy to
// fix this but not sure if it available on all of our builds.

Powered by Google App Engine
This is Rietveld 408576698