From: Yusuke Endoh Date: 2011-07-11T03:13:07+09:00 Subject: [ruby-core:37970] [Ruby 1.9 - Bug #4347] Tracing cannot be re-enabled after callcc [patch] Issue #4347 has been updated by Yusuke Endoh. Assignee changed from Koichi Sasada to Yusuke Endoh Hello, 2011/1/31 James M. Lawrence : > In thread.c (thread_suppress_tracing) the code after (*func)(arg, running) > is not executed, causing th->tracing to not be cleared. > > This two-line patch works, though it may only address a symptom. Thank you for your reporting and providing patch. The root cause of this issue is that Continuation#call ignores ensure clause: callcc do |c| begin c.call ensure p :foo end end #=> nothing output When Continuation#call is executed in the proc of set_trace_func, it skips the post-processing of set_trace_func, resulting in corrupt state of rb_thread_t#tracing. Your patch forces to reset the state when set_trace_func(nil). But to address this issue fundamentally, Continuation#call must call current ensure clauses. It needs very hard work, though. As you know, your patch is not essintial fix, but it works actually in your example, and looks benign. So I'll import it. But note that there is still other issues, and that this issue may have a relapse in future. If you want not to hit a land mine, do not use callcc seriously. It is very fun, joke feature, I think. Thanks, -- Yusuke Endoh ---------------------------------------- Bug #4347: Tracing cannot be re-enabled after callcc [patch] http://redmine.ruby-lang.org/issues/4347 Author: James M. Lawrence Status: Assigned Priority: Normal Assignee: Yusuke Endoh Category: core Target version: 1.9.3 ruby -v: ruby 1.9.3dev (2011-01-30 trunk 30735) [i386-darwin9.8.0] =begin % patch -p1 < test_continuation_tracing.patch patching file test/ruby/test_continuation.rb % ./ruby -v test/ruby/test_continuation.rb ruby 1.9.3dev (2011-01-30 trunk 30735) [i386-darwin9.8.0] Run options: # Running tests: ......FF Finished tests in 0.080788s, 99.0246 tests/s, 148.5369 assertions/s. 1) Failure: test_tracing_with_set_trace_func(TestContinuation) [test/ruby/test_continuation.rb:99]: <3> expected but was <1>. 2) Failure: test_tracing_with_thread_set_trace_func(TestContinuation) [test/ruby/test_continuation.rb:121]: <3> expected but was <0>. In thread.c (thread_suppress_tracing) the code after (*func)(arg, running) is not executed, causing th->tracing to not be cleared. This two-line patch works, though it may only address a symptom. =end -- http://redmine.ruby-lang.org