summaryrefslogtreecommitdiff
path: root/vm_eval.c
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-06-14 05:59:23 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-06-14 05:59:23 +0000
commit63bd8a74e81537ecf2aba0be0f8ef6eec9df2758 (patch)
tree438b47a99a569e357944ccbf0cc072b3213cad18 /vm_eval.c
parentd3027870eeebed365979875858159d98e0f1effa (diff)
* thread.c, vm_eval.c: add Thread.backtrace.
* test/ruby/test_thread.rb: add a test. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@23691 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_eval.c')
-rw-r--r--vm_eval.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/vm_eval.c b/vm_eval.c
index 596701e2c0..2dff373e42 100644
--- a/vm_eval.c
+++ b/vm_eval.c
@@ -1348,6 +1348,25 @@ rb_make_backtrace(void)
}
VALUE
+rb_thread_backtrace(VALUE thval)
+{
+ rb_thread_t *th;
+ GetThreadPtr(thval, th);
+
+ switch (th->status) {
+ case THREAD_RUNNABLE:
+ case THREAD_STOPPED:
+ case THREAD_STOPPED_FOREVER:
+ break;
+ case THREAD_TO_KILL:
+ case THREAD_KILLED:
+ return Qnil;
+ }
+
+ return vm_backtrace(th, 0);
+}
+
+VALUE
rb_backtrace_each(rb_backtrace_iter_func *iter, void *arg)
{
return vm_backtrace_each(GET_THREAD(), -1, iter, arg);