diff --git a/ChangeLog b/ChangeLog index b3f80f2bad..7fa0351006 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Fri Jun 30 21:13:25 2017 Nobuyoshi Nakada + + * proc.c (method_super_method): skip prepended modules and continue from + the super class of the original class. [Bug #13656] + Fri Jun 30 21:10:48 2017 Shugo Maeda * lib/net/smtp.rb (getok, get_response): raise an ArgumentError when diff --git a/proc.c b/proc.c index 87e3cd1a5a..eeec99232c 100644 --- a/proc.c +++ b/proc.c @@ -2572,7 +2572,7 @@ method_super_method(VALUE method) const rb_method_entry_t *me; TypedData_Get_Struct(method, struct METHOD, &method_data_type, data); - super_class = RCLASS_SUPER(method_entry_defined_class(data->me)); + super_class = RCLASS_SUPER(RCLASS_ORIGIN(method_entry_defined_class(data->me))); if (!super_class) return Qnil; me = (rb_method_entry_t *)rb_callable_method_entry_without_refinements(super_class, data->me->called_id); if (!me) return Qnil; diff --git a/test/ruby/test_method.rb b/test/ruby/test_method.rb index a5ea258f92..262e2ffd97 100644 --- a/test/ruby/test_method.rb +++ b/test/ruby/test_method.rb @@ -905,6 +905,18 @@ class TestMethod < Test::Unit::TestCase assert_nil(m) end + def test_super_method_with_prepended_module + bug = '[ruby-core:81666] [Bug #13656] should be the method of the parent' + c1 = EnvUtil.labeled_class("C1") {def m; end} + c2 = EnvUtil.labeled_class("C2", c1) {def m; end} + c2.prepend(EnvUtil.labeled_module("M")) + m1 = c1.instance_method(:m) + m2 = c2.instance_method(:m).super_method + assert_equal(m1, m2, bug) + assert_equal(c1, m2.owner, bug) + assert_equal(m1.source_location, m2.source_location, bug) + end + def rest_parameter(*rest) rest end diff --git a/version.h b/version.h index f8f143c42f..9d2f8b14b4 100644 --- a/version.h +++ b/version.h @@ -1,6 +1,6 @@ #define RUBY_VERSION "2.3.5" #define RUBY_RELEASE_DATE "2017-06-30" -#define RUBY_PATCHLEVEL 327 +#define RUBY_PATCHLEVEL 328 #define RUBY_RELEASE_YEAR 2017 #define RUBY_RELEASE_MONTH 6