From: George Koehler Date: 2011-10-31T10:27:41+09:00 Subject: [ruby-core:40543] [ruby-trunk - Bug #5519] Enumerator#next skips c-return hooks Issue #5519 has been updated by George Koehler. =begin This trace seems correct to me. There is no c-return because Array#each and Enumerator#each are not returning. To see the c-return, you call ((*b.next*)) 4 more times. Array#each and Enumerator#each both c-return soon before Enumerator#next raises StopIteration. I am not sure how this works, but I guess that Enumerator#each runs on a different Fiber with a separate call stack. =end ---------------------------------------- Bug #5519: Enumerator#next skips c-return hooks http://redmine.ruby-lang.org/issues/5519 Author: T S Status: Open Priority: Normal Assignee: Category: Target version: 1.9.2 ruby -v: ruby 1.9.2p290 (2011-07-09 revision 32553) [i686-linux] In some cases, especially using #next, c-calls are traced, but corresponding c-returns are not. tracing this snippet: a=[1,2,3,4].to_enum b=a.next produces this output: c-return test4.rb:3 set_trace_func Kernel line test4.rb:4 c-call test4.rb:4 to_enum Kernel c-return test4.rb:4 to_enum Kernel line test4.rb:5 c-call test4.rb:5 next Enumerator c-call test4.rb:5 proc Kernel c-return test4.rb:5 proc Kernel c-call :0 each Enumerator c-call :0 each Array c-return test4.rb:5 next Enumerator Enumerator#each and Array#each are c-called, but the next return jumps back up to Enumerator#next. I get the same result on 1.9.2-p290, 1.9.2-head(r32926), and 1.9.3-head(r33569) -- http://redmine.ruby-lang.org