summaryrefslogtreecommitdiff
path: root/vm_dump.c
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-05-25 04:50:10 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-05-25 04:50:10 +0000
commit1f3142a4477a10bfe566c17837c2a0b9f6cba00f (patch)
treeaaa2ab6627c58640564493cf8a3d3c5a2703b082 /vm_dump.c
parent26f96fe1ce6178a83a0b3f0dbb9b4b9c7692103e (diff)
* vm.c: refactoring backtrace related funcitons.
(1) unify similar functions (rb_backtrace_each() and backtrace_object()). backtrace_each() is a unified function. variation: a) backtrace_object(): create backtrace object. b) vm_backtrace_str_ary(): create bt as an array of string. c) vm_backtrace_print(): print backtrace to specified file. d) rb_backtrace_print_as_bugreport(): print backtrace on bugreport style. (2) remove rb_backtrace_each(). Use backtrace_each() instead. (3) chang the type of lev parameter to size_t. a) lev == 0 means current frame (exception, etc use it). b) lev == 1 means upper frame (caller(0) use it). * vm_core.h, vm_dump.c, vm_eval.c: ditto. * vm.c (backtrace_object(), vm_backtrace_str_ary()): fix to return a correct size of caller(lev) array. Let n be a "caller(0).size" then ln as caller(lev).size should be (n - lev). However, the previous implementation returns a wrong size array (ln > n - lev). [ruby-dev:45673] * test/ruby/test_backtrace.rb: add tests for backtrace. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35787 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_dump.c')
-rw-r--r--vm_dump.c27
1 files changed, 4 insertions, 23 deletions
diff --git a/vm_dump.c b/vm_dump.c
index 133499c780..bc7af85994 100644
--- a/vm_dump.c
+++ b/vm_dump.c
@@ -572,24 +572,6 @@ rb_vmdebug_thread_dump_state(VALUE self)
return Qnil;
}
-static int
-bugreport_backtrace(void *arg, VALUE file, int line, VALUE method)
-{
- const char *filename = NIL_P(file) ? "ruby" : RSTRING_PTR(file);
- if (!*(int *)arg) {
- fprintf(stderr, "-- Ruby level backtrace information "
- "----------------------------------------\n");
- *(int *)arg = 1;
- }
- if (NIL_P(method)) {
- fprintf(stderr, "%s:%d:in unknown method\n", filename, line);
- }
- else {
- fprintf(stderr, "%s:%d:in `%s'\n", filename, line, RSTRING_PTR(method));
- }
- return 0;
-}
-
#if defined(__FreeBSD__) && defined(__OPTIMIZE__)
#undef HAVE_BACKTRACE
#endif
@@ -774,6 +756,8 @@ dump_thread(void *arg)
}
#endif
+void rb_backtrace_print_as_bugreport(void);
+
void
rb_vm_bugreport(void)
{
@@ -787,12 +771,9 @@ rb_vm_bugreport(void)
#endif
const rb_vm_t *const vm = GET_VM();
if (vm) {
- int i = 0;
SDR();
-
- if (rb_backtrace_each(bugreport_backtrace, &i)) {
- fputs("\n", stderr);
- }
+ rb_backtrace_print_as_bugreport();
+ fputs("\n", stderr);
}
#if HAVE_BACKTRACE || defined(_WIN32)