Skip to content

Commit

Permalink
Don't display singleton class in Method#inspect unless method defined…
Browse files Browse the repository at this point in the history
… there

Previously, if an object has a singleton class, and you call
Object#method on the object, the resulting string would include
the object's singleton class, even though the method was not
defined in the singleton class.

Change this so the we only show the singleton class if the method
is defined in the singleton class.

Fixes [Bug #15608]

(cherry picked from commit e02bd0e)
  • Loading branch information
jeremyevans authored and nurse committed Mar 14, 2020
1 parent eabf35a commit 0d24fb7
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 1 deletion.
9 changes: 8 additions & 1 deletion proc.c
Original file line number Diff line number Diff line change
Expand Up @@ -2804,7 +2804,8 @@ method_inspect(VALUE method)
TypedData_Get_Struct(method, struct METHOD, &method_data_type, data);
str = rb_sprintf("#<% "PRIsVALUE": ", rb_obj_class(method));

mklass = data->klass;
mklass = data->iclass;
if (!mklass) mklass = data->klass;

if (RB_TYPE_P(mklass, T_ICLASS)) {
/* TODO: I'm not sure why mklass is T_ICLASS.
Expand Down Expand Up @@ -2844,6 +2845,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));
}
rb_str_buf_append(str, rb_inspect(mklass));
if (defined_class != mklass) {
rb_str_catf(str, "(% "PRIsVALUE")", defined_class);
Expand Down
18 changes: 18 additions & 0 deletions spec/ruby/core/method/shared/to_s.rb
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,22 @@
it "returns a String containing the Module the method is referenced from" do
@string.should =~ /MethodSpecs::MySub/
end

ruby_version_is '2.8' do
it "returns a String containing the Module containing the method if object has a singleton class but method is not defined in the singleton class" do
obj = MethodSpecs::MySub.new
obj.singleton_class
@m = obj.method(:bar)
@string = @m.send(@method).sub(/0x\w+/, '0xXXXXXX')
@string.should =~ /\A#<Method: MethodSpecs::MySub\(MethodSpecs::MyMod\)#bar\(\) /
end
end

it "returns a String containing the singleton class if method is defined in the singleton class" do
obj = MethodSpecs::MySub.new
def obj.bar; end
@m = obj.method(:bar)
@string = @m.send(@method).sub(/0x\w+/, '0xXXXXXX')
@string.should =~ /\A#<Method: #<MethodSpecs::MySub:0xXXXXXX>\.bar/
end
end
8 changes: 8 additions & 0 deletions test/ruby/test_method.rb
Original file line number Diff line number Diff line change
Expand Up @@ -459,6 +459,14 @@ def o.foo; end; line_no = __LINE__
c3.class_eval { alias bar foo }
m3 = c3.new.method(:bar)
assert_equal("#<Method: #{c3.inspect}(#{c.inspect})#bar(foo)() #{__FILE__}:#{line_no}>", m3.inspect, bug7806)

bug15608 = '[ruby-core:91570] [Bug #15608]'
c4 = Class.new(c)
c4.class_eval { alias bar foo }
o = c4.new
o.singleton_class
m4 = o.method(:bar)
assert_equal("#<Method: #{c4.inspect}(#{c.inspect})#bar(foo)() #{__FILE__}:#{line_no}>", m4.inspect, bug15608)
end

def test_callee_top_level
Expand Down

0 comments on commit 0d24fb7

Please sign in to comment.