[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]