* method.h: introduce the folliwing field and macros.

* rb_method_definition_t::complemented_count to count shared method
    entries because of complemented method entries and separate from
    alias_count.

    Shared `def' only by complemented method entries should not prevent
    method re-definition warning.

  * METHOD_ENTRY_COMPLEMENTED(me) to represent complemented method entry.
  * METHOD_ENTRY_COMPLEMENTED_SET(me) to check it as  complemented me.

* vm_insnhelper.c (aliased_callable_method_entry): should also
  check me->def->complemented_count.

* vm_method.c (method_definition_addref_complement): add to count
  complemented method entries number.

* vm_method.c (rb_method_definition_release): release `def' iff
  alias_count == 0 and complemented_count == 0.

* test/ruby/test_module.rb: add a test.




git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52636 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
ko1 2015-11-18 08:15:51 +00:00
parent e2f0af5740
commit 3f7c0e9fd5
5 changed files with 71 additions and 12 deletions

View file

@ -1280,6 +1280,20 @@ class TestModule < Test::Unit::TestCase
undef foo
end
end
stderr = EnvUtil.verbose_warning do
Module.new do
def foo; end
mod = self
c = Class.new do
include mod
end
c.new.foo
def foo; end
end
end
assert_match(/: warning: method redefined; discarding old foo/, stderr)
assert_match(/: warning: previous definition of foo/, stderr)
end
def test_protected_singleton_method