diff --git a/ChangeLog b/ChangeLog index 922490c938..f753bb83b9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Mon Aug 6 11:34:33 2012 Nobuyoshi Nakada + + * insns.def (defined): now should use klass in the current control + frame to search superclass, not me->klass. reported by naruse. + Mon Aug 6 11:19:19 2012 NAKAMURA Usaku * test/etc/test_etc.rb (TestEtc#test_getpwuid): `s' is never set to nil. diff --git a/insns.def b/insns.def index fd102a63f5..7b17b42579 100644 --- a/insns.def +++ b/insns.def @@ -828,7 +828,7 @@ defined case DEFINED_ZSUPER:{ const rb_method_entry_t *me = GET_CFP()->me; if (me) { - VALUE klass = vm_search_normal_superclass(me->klass); + VALUE klass = vm_search_normal_superclass(GET_CFP()->klass); ID id = me->def ? me->def->original_id : me->called_id; if (rb_method_boundp(klass, id, 0)) { expr_type = "super"; diff --git a/test/ruby/test_defined.rb b/test/ruby/test_defined.rb index 99c866fc2d..c02d1376b2 100644 --- a/test/ruby/test_defined.rb +++ b/test/ruby/test_defined.rb @@ -152,4 +152,22 @@ class TestDefined < Test::Unit::TestCase assert_equal("super", aa.f, bug6644) assert_nil(a.f, bug6644) end + + def test_super_in_included_method + c0 = Class.new do + def m + end + end + m1 = Module.new do + def m + defined?(super) + end + end + c = Class.new(c0) do include m1 + def m + super + end + end + assert_equal("super", c.new.m) + end end