From e02bd0e713ef920e6d12c27f16548f48ec5c2cf0 Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Mon, 9 Mar 2020 07:57:16 -0700 Subject: Don't display singleton class in Method#inspect unless method defined 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] --- proc.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'proc.c') diff --git a/proc.c b/proc.c index 390b1bf3fa..0b1be9c212 100644 --- a/proc.c +++ b/proc.c @@ -2812,7 +2812,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. @@ -2852,6 +2853,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); -- cgit v1.2.3