From cc48423ead1d9e4b46dfeca7a45437793fc29521 Mon Sep 17 00:00:00 2001 From: nobu Date: Mon, 6 Aug 2012 02:34:36 +0000 Subject: [PATCH] insns.def: use klass in cfp * insns.def (defined): now should use klass in the current control frame to search superclass, not me->klass. reported by naruse. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36637 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ insns.def | 2 +- test/ruby/test_defined.rb | 18 ++++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) 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