proc.c: follow the original class
* proc.c (mnew_internal): follow the original class, not to loop the prepended module. [ruby-core:77591] [Bug #12832] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56489 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
58206933b4
commit
d977cd4e0a
@ -1,3 +1,8 @@
|
|||||||
|
Tue Oct 25 12:54:07 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* proc.c (mnew_internal): follow the original class, not to loop
|
||||||
|
the prepended module. [ruby-core:77591] [Bug #12832]
|
||||||
|
|
||||||
Mon Oct 24 10:52:17 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Mon Oct 24 10:52:17 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* test/lib/test/unit.rb (Test::Unit::Parallel#deal): update the
|
* test/lib/test/unit.rb (Test::Unit::Parallel#deal): update the
|
||||||
|
2
proc.c
2
proc.c
@ -1370,7 +1370,7 @@ mnew_internal(const rb_method_entry_t *me, VALUE klass,
|
|||||||
}
|
}
|
||||||
if (me->def->type == VM_METHOD_TYPE_ZSUPER) {
|
if (me->def->type == VM_METHOD_TYPE_ZSUPER) {
|
||||||
if (me->defined_class) {
|
if (me->defined_class) {
|
||||||
VALUE klass = RCLASS_SUPER(me->defined_class);
|
VALUE klass = RCLASS_SUPER(RCLASS_ORIGIN(me->defined_class));
|
||||||
id = me->def->original_id;
|
id = me->def->original_id;
|
||||||
me = (rb_method_entry_t *)rb_callable_method_entry_without_refinements(klass, id);
|
me = (rb_method_entry_t *)rb_callable_method_entry_without_refinements(klass, id);
|
||||||
}
|
}
|
||||||
|
@ -885,6 +885,22 @@ class TestMethod < Test::Unit::TestCase
|
|||||||
assert_nil(m, Feature9781)
|
assert_nil(m, Feature9781)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_prepended_public_zsuper
|
||||||
|
mod = EnvUtil.labeled_module("Mod") {private def foo; :ok end}
|
||||||
|
mods = [mod]
|
||||||
|
obj = Object.new.extend(mod)
|
||||||
|
class << obj
|
||||||
|
public :foo
|
||||||
|
end
|
||||||
|
2.times do |i|
|
||||||
|
mods.unshift(mod = EnvUtil.labeled_module("Mod#{i}") {def foo; end})
|
||||||
|
obj.singleton_class.prepend(mod)
|
||||||
|
end
|
||||||
|
m = obj.method(:foo)
|
||||||
|
assert_equal(mods, mods.map {m.owner.tap {m = m.super_method}})
|
||||||
|
assert_nil(m)
|
||||||
|
end
|
||||||
|
|
||||||
def rest_parameter(*rest)
|
def rest_parameter(*rest)
|
||||||
rest
|
rest
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user