ruby-changes:12025
From: ko1 <ko1@a...>
Date: Sun, 14 Jun 2009 15:01:09 +0900 (JST)
Subject: [ruby-changes:12025] Ruby:r23691 (trunk): * thread.c, vm_eval.c: add Thread.backtrace.
ko1 2009-06-14 14:59:23 +0900 (Sun, 14 Jun 2009) New Revision: 23691 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=23691 Log: * thread.c, vm_eval.c: add Thread.backtrace. * test/ruby/test_thread.rb: add a test. Modified files: trunk/ChangeLog trunk/test/ruby/test_thread.rb trunk/thread.c trunk/vm_eval.c Index: ChangeLog =================================================================== --- ChangeLog (revision 23690) +++ ChangeLog (revision 23691) @@ -1,3 +1,9 @@ +Sun Jun 14 14:57:57 2009 Koichi Sasada <ko1@a...> + + * thread.c, vm_eval.c: add Thread.backtrace. + + * test/ruby/test_thread.rb: add a test. + Sun Jun 14 13:58:32 2009 Koichi Sasada <ko1@a...> * transcode.c (transcode_restartable0): revert last commit because Index: vm_eval.c =================================================================== --- vm_eval.c (revision 23690) +++ vm_eval.c (revision 23691) @@ -1348,6 +1348,25 @@ } 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); Index: thread.c =================================================================== --- thread.c (revision 23690) +++ thread.c (revision 23691) @@ -3817,6 +3817,14 @@ return result; } +VALUE rb_thread_backtrace(VALUE thval); + +static VALUE +rb_thread_backtrace_m(VALUE thval) +{ + return rb_thread_backtrace(thval); +} + /* * +Thread+ encapsulates the behavior of a thread of * execution, including the main thread of the Ruby script. @@ -3873,6 +3881,7 @@ rb_define_method(rb_cThread, "abort_on_exception=", rb_thread_abort_exc_set, 1); rb_define_method(rb_cThread, "safe_level", rb_thread_safe_level, 0); rb_define_method(rb_cThread, "group", rb_thread_group, 0); + rb_define_method(rb_cThread, "backtrace", rb_thread_backtrace_m, 0); rb_define_method(rb_cThread, "inspect", rb_thread_inspect, 0); Index: test/ruby/test_thread.rb =================================================================== --- test/ruby/test_thread.rb (revision 23690) +++ test/ruby/test_thread.rb (revision 23691) @@ -516,4 +516,14 @@ c.class_eval { def initialize; end } assert_raise(ThreadError) { c.new.start } end + + def test_backtrace + Thread.new{ + assert_equal(Array, Thread.main.backtrace.class) + }.join + + t = Thread.new{} + t.join + assert_equal(nil, t.backtrace) + end end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/