From: "tenderlovemaking (Aaron Patterson)" Date: 2012-08-21T02:41:18+09:00 Subject: [ruby-core:47252] [ruby-trunk - Bug #6867] super in a Mutex#synchronize block Issue #6867 has been updated by tenderlovemaking (Aaron Patterson). File fix.patch added I'm hitting this bug in the Rails tests too. It does not need to be a synchronize block. Any method that yields will cause this error: class A; def self.yielder; yield; end end class X def self.hello; 'hi'; end end class Y < X def self.hello; A.yielder { super() }; end end Y.hello I've attached a patch with a test and fix. It seems that the loop that walks up the control frames would stop even though there is a valid recipient for that method further up the stack. I'm not incredibly pleased with my patch because it has to do a `kind_of` for each object as it walks up, but it does fix this bug. Shugo - do you have a better fix for this, or may I apply this patch? Thanks. ---------------------------------------- Bug #6867: super in a Mutex#synchronize block https://bugs.ruby-lang.org/issues/6867#change-28945 Author: Eregon (Benoit Daloze) Status: Open Priority: Normal Assignee: shugo (Shugo Maeda) Category: core Target version: 2.0.0 ruby -v: ruby 2.0.0dev (2012-08-14 trunk 36700) [x86_64-darwin10.8.0] The following code: require 'thread' class Parent def meth end end class Child < Parent def meth Mutex.new.synchronize do super end end end Child.new.meth raises bug_super.rb:13:in `block in meth': can't find the method for super, which may be called in an orphan block (NoMethodError) from :10:in `synchronize' from bug_super.rb:12:in `meth' from bug_super.rb:18:in `
' I met the bug with the listen gem: https://github.com/guard/listen/blob/master/lib/listen/adapters/darwin.rb#L22-25 . -- http://bugs.ruby-lang.org/