diff options
-rw-r--r-- | proc.c | 9 | ||||
-rw-r--r-- | spec/ruby/core/method/shared/to_s.rb | 6 | ||||
-rw-r--r-- | test/ruby/test_method.rb | 14 |
3 files changed, 26 insertions, 3 deletions
@@ -3003,9 +3003,12 @@ method_inspect(VALUE method) else { mklass = data->klass; if (FL_TEST(mklass, FL_SINGLETON)) { - do { - mklass = RCLASS_SUPER(mklass); - } while (RB_TYPE_P(mklass, T_ICLASS)); + VALUE v = rb_ivar_get(mklass, attached); + if (!(RB_TYPE_P(v, T_CLASS) || RB_TYPE_P(v, T_MODULE))) { + do { + mklass = RCLASS_SUPER(mklass); + } while (RB_TYPE_P(mklass, T_ICLASS)); + } } rb_str_buf_append(str, rb_inspect(mklass)); if (defined_class != mklass) { diff --git a/spec/ruby/core/method/shared/to_s.rb b/spec/ruby/core/method/shared/to_s.rb index 1fbee870d6..8f7dd8c161 100644 --- a/spec/ruby/core/method/shared/to_s.rb +++ b/spec/ruby/core/method/shared/to_s.rb @@ -62,6 +62,12 @@ describe :method_to_s, shared: true do @m = obj.method(:bar) @string = @m.send(@method) @string.should.start_with? "#<Method: MethodSpecs::MySub(MethodSpecs::MyMod)#bar" + + c = MethodSpecs::MySub.dup + m = Module.new{def bar; end} + c.extend(m) + @string = c.method(:bar).send(@method) + @string.should.start_with? "#<Method: #<Class:#{c.inspect}>(#{m.inspect})#bar" end end diff --git a/test/ruby/test_method.rb b/test/ruby/test_method.rb index af47261859..3dfab84e93 100644 --- a/test/ruby/test_method.rb +++ b/test/ruby/test_method.rb @@ -472,6 +472,20 @@ class TestMethod < Test::Unit::TestCase o.singleton_class m4 = o.method(:bar) assert_equal("#<Method: #{c4.inspect}(#{c.inspect})#bar(foo)() #{__FILE__}:#{line_no}>", m4.inspect, bug15608) + + bug17428 = '[ruby-core:101635] [Bug #17428]' + c4 = Class.new(c) + c4.class_eval { alias bar foo } + o = c4.new + o.singleton_class + m4 = o.method(:bar) + assert_equal("#<Method: #<Class:String>(Module)#prepend(*)>", String.method(:prepend).inspect, bug17428) + + c5 = Class.new(String) + m = Module.new{def prepend; end; alias prep prepend}; line_no = __LINE__ + c5.extend(m) + c6 = Class.new(c5) + assert_equal("#<Method: #<Class:#{c6.inspect}>(#{m.inspect})#prep(prepend)() #{__FILE__}:#{line_no}>", c6.method(:prep).inspect, bug17428) end def test_callee_top_level |