I have discovered a regression in the behaviour of (({defined?(super)})). It functions as expected in 1.9.3-p392, but has changed in 2.0.0-p0 and in 2.1.0dev (2013-05-03 trunk 40571).
On Ruby 1.9.3, the call returns the string (({"super"})). On 2.0.0-p0 and above, the call returns (({nil})). The change seems to be specific to the inside of a block in a method that is defined in a module that is extended onto the object where the method is called.
This is a minimal reproduction example, which I have also attached as "super-gone.rb".
class C
def x; end
end
module M
def b; yield; end
def x
b do
# On 1.9.3, this is "super", but on 2.0.0 it is nil
p defined?(super)
end
end
end
This issue was solved with changeset r40583.
André, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
insns.def: method entry from method frame
insns.def (defined): get method entry from the method top level
frame, not block frame. [ruby-core:54769] [Bug #8367]
This issue was solved with changeset r40613.
André, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
* insns.def (defined): get method entry from the method top level
frame, not block frame. [ruby-core:54769] [Bug #8367]
* insns.def (defined): use vm_search_superclass() like as normal super
call. based on a patch <https://gist.github.com/wanabe/5520026> by
wanabe.
* vm_insnhelper.c (vm_search_superclass): return error but not raise
exceptions.
* vm_insnhelper.c (vm_search_super_method): check the result of
vm_search_superclass and raise execptions on error.
vm_search_superclass and raise exceptions on error.