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

ruby-changes:20549

From: mame <ko1@a...>
Date: Thu, 21 Jul 2011 20:10:02 +0900 (JST)
Subject: [ruby-changes:20549] mame:r32597 (trunk): * thread.c (set_trace_func, thread_set_trace_func_m): reset tracing

mame	2011-07-21 20:09:52 +0900 (Thu, 21 Jul 2011)

  New Revision: 32597

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=32597

  Log:
    * thread.c (set_trace_func, thread_set_trace_func_m): reset tracing
      state when set_trace_func hook is removed.  This is workaround patch
      to force to reset tracing state that is broken by continuation call.
      a patch from James M. Lawrence.  [Feature #4347] [ruby-core:34998]
    
    * test/ruby/test_continuation.rb (class TestContinuation): add a test
      for above.  a patch from James M. Lawrence.

  Modified files:
    trunk/ChangeLog
    trunk/test/ruby/test_continuation.rb
    trunk/thread.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 32596)
+++ ChangeLog	(revision 32597)
@@ -1,3 +1,13 @@
+Thu Jul 21 20:02:11 2011  Yusuke Endoh  <mame@t...>
+
+	* thread.c (set_trace_func, thread_set_trace_func_m): reset tracing
+	  state when set_trace_func hook is removed.  This is workaround patch
+	  to force to reset tracing state that is broken by continuation call.
+	  a patch from James M. Lawrence.  [Feature #4347] [ruby-core:34998]
+
+	* test/ruby/test_continuation.rb (class TestContinuation): add a test
+	  for above.  a patch from James M. Lawrence.
+
 Thu Jul 21 19:27:19 2011  Yusuke Endoh  <mame@t...>
 
 	* node.c (dump_node): add today's knowledge.  "init arguments (m)" and
Index: thread.c
===================================================================
--- thread.c	(revision 32596)
+++ thread.c	(revision 32597)
@@ -4347,6 +4347,7 @@
     rb_remove_event_hook(call_trace_func);
 
     if (NIL_P(trace)) {
+	GET_THREAD()->tracing = EVENT_RUNNING_NOTHING;
 	return Qnil;
     }
 
@@ -4403,6 +4404,7 @@
     rb_threadptr_remove_event_hook(th, call_trace_func);
 
     if (NIL_P(trace)) {
+	th->tracing = EVENT_RUNNING_NOTHING;
 	return Qnil;
     }
     thread_add_trace_func(th, trace);
Index: test/ruby/test_continuation.rb
===================================================================
--- test/ruby/test_continuation.rb	(revision 32596)
+++ test/ruby/test_continuation.rb	(revision 32597)
@@ -77,5 +77,48 @@
     }, '[ruby-dev:34802]'
   end
 
+  def tracing_with_set_trace_func
+    cont = nil
+    func = lambda do |*args|
+      @memo += 1
+      cont.call(nil)
+    end
+    cont = callcc { |cc| cc }
+    if cont
+      set_trace_func(func)
+    else
+      set_trace_func(nil)
+    end
+  end
+
+  def test_tracing_with_set_trace_func
+    @memo = 0
+    tracing_with_set_trace_func
+    tracing_with_set_trace_func
+    tracing_with_set_trace_func
+    assert_equal 3, @memo
+  end
+
+  def tracing_with_thread_set_trace_func
+    cont = nil
+    func = lambda do |*args|
+      @memo += 1
+      cont.call(nil)
+    end
+    cont = callcc { |cc| cc }
+    if cont
+      Thread.current.set_trace_func(func)
+    else
+      Thread.current.set_trace_func(nil)
+    end
+  end
+
+  def test_tracing_with_thread_set_trace_func
+    @memo = 0
+    tracing_with_thread_set_trace_func
+    tracing_with_thread_set_trace_func
+    tracing_with_thread_set_trace_func
+    assert_equal 3, @memo
+  end
 end
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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