From: "ko1 (Koichi Sasada)" Date: 2012-08-16T11:34:25+09:00 Subject: [ruby-core:47220] [ruby-trunk - Feature #4347][Assigned] Tracing cannot be re-enabled after callcc [patch] Issue #4347 has been updated by ko1 (Koichi Sasada). Status changed from Closed to Assigned Assignee changed from mame (Yusuke Endoh) to ko1 (Koichi Sasada) I reopen this ticket. As you say, this is only workaround. I solve this problem with restoring 'tracing state' (running trace func or not) at Continuation#call. I believe it is not a work around, but essential solution. I revert your proposal and set_trace_func(nil) does not clear tracing state any more. With this change, your test code go to infinite loop: # example code require 'continuation' cont = nil func = lambda{|*args| p [1, args] cont.call(nil) } 3.times{ cont = callcc{|c| c} # -> (1) call trace func (c-return), (2) call cont.call(nil) and come here! p cont if cont set_trace_func(func) else set_trace_func(nil) end } With my patch, this example work fine: require 'continuation' cont = nil func = lambda{|*args| p [1, args] cont, c = nil, cont c.call(nil) if c } 3.times{|i| p i cont = callcc{|c| c} p cont if cont set_trace_func(func) end } I quote mame-san's comment, again. > 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. ---------------------------------------- Feature #4347: Tracing cannot be re-enabled after callcc [patch] https://bugs.ruby-lang.org/issues/4347#change-28902 Author: quix (James M. Lawrence) Status: Assigned Priority: Normal Assignee: ko1 (Koichi Sasada) Category: core Target version: 2.0.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://bugs.ruby-lang.org/