summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--proc.c10
-rw-r--r--test/ruby/test_method.rb9
3 files changed, 22 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 3fb504666f..34fb7d26b0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Sat Dec 14 00:18:08 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * proc.c (mnew_from_me): achieve the original defined_class from
+ prepended iclass, to fix inherited owner.
+
+ * proc.c (method_owner): return the defined class, but not the
+ class which the method object is created from.
+
Fri Dec 13 22:29:21 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
* proc.c (method_owner): return the class where alias is defined, not
diff --git a/proc.c b/proc.c
index f72b019684..3e22ebd156 100644
--- a/proc.c
+++ b/proc.c
@@ -1168,6 +1168,10 @@ mnew_from_me(rb_method_entry_t *me, VALUE defined_class, VALUE klass,
goto again;
}
+ if (RB_TYPE_P(defined_class, T_ICLASS)) {
+ defined_class = RBASIC_CLASS(defined_class);
+ }
+
klass = defined_class;
while (rclass != klass &&
@@ -1175,10 +1179,6 @@ mnew_from_me(rb_method_entry_t *me, VALUE defined_class, VALUE klass,
rclass = RCLASS_SUPER(rclass);
}
- if (RB_TYPE_P(klass, T_ICLASS)) {
- klass = RBASIC(klass)->klass;
- }
-
gen_method:
method = TypedData_Make_Struct(mclass, struct METHOD, &method_data_type, data);
@@ -1395,7 +1395,7 @@ method_owner(VALUE obj)
struct METHOD *data;
TypedData_Get_Struct(obj, struct METHOD, &method_data_type, data);
- return data->rclass;
+ return data->defined_class;
}
void
diff --git a/test/ruby/test_method.rb b/test/ruby/test_method.rb
index a81d6d3812..45268ed779 100644
--- a/test/ruby/test_method.rb
+++ b/test/ruby/test_method.rb
@@ -180,6 +180,15 @@ class TestMethod < Test::Unit::TestCase
assert_equal(Array.instance_method(:map).hash, Array.instance_method(:collect).hash)
end
+ def test_owner
+ c = Class.new do
+ def foo; end
+ end
+ assert_equal(c, c.instance_method(:foo).owner)
+ c2 = Class.new(c)
+ assert_equal(c, c2.instance_method(:foo).owner)
+ end
+
def test_receiver_name_owner
o = Object.new
def o.foo; end