aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-09-29 04:37:52 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-09-29 04:37:52 +0000
commit1fe57a4b5d4d8673e9841f99b23d1935537a855a (patch)
tree7d76f14c2194e897744000797b80a39171c209c6
parent5e4d04c36e33dc23a06cd6e5b53f5e7bef4394f7 (diff)
downloadruby-1fe57a4b5d4d8673e9841f99b23d1935537a855a.tar.gz
* vm_method.c (rb_add_method_def): nothing to do if old method had
same definition. [ruby-dev:39397] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@25147 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--test/ruby/test_class.rb8
-rw-r--r--vm_method.c11
3 files changed, 22 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index cad77d1f2d..1c9c20a1b5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Tue Sep 29 13:37:50 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_method.c (rb_add_method_def): nothing to do if old method had
+ same definition. [ruby-dev:39397]
+
Tue Sep 29 06:50:32 2009 NARUSE, Yui <naruse@ruby-lang.org>
* string.c (rb_str_inspect): dump as \uXXXX when the
diff --git a/test/ruby/test_class.rb b/test/ruby/test_class.rb
index 8d618822a5..382dbb9cc3 100644
--- a/test/ruby/test_class.rb
+++ b/test/ruby/test_class.rb
@@ -130,6 +130,14 @@ class TestClass < Test::Unit::TestCase
end
end
assert_equal("", stderr)
+ stderr = verbose_warning do
+ Module.new do
+ module_function
+ def foo; end
+ module_function :foo
+ end
+ end
+ assert_equal("", stderr, '[ruby-dev:39397]')
end
def test_check_inheritable
diff --git a/vm_method.c b/vm_method.c
index 3eef4449df..434e8424cc 100644
--- a/vm_method.c
+++ b/vm_method.c
@@ -141,6 +141,8 @@ rb_free_method_entry(rb_method_entry_t *me)
xfree(me);
}
+static int rb_method_definition_eq(const rb_method_definition_t *d1, const rb_method_definition_t *d2);
+
static rb_method_entry_t *
rb_add_method_def(VALUE klass, ID mid, rb_method_type_t type, rb_method_definition_t *def, rb_method_flag_t noex)
{
@@ -179,7 +181,7 @@ rb_add_method_def(VALUE klass, ID mid, rb_method_type_t type, rb_method_definiti
rb_method_entry_t *old_me = (rb_method_entry_t *)data;
rb_method_definition_t *old_def = old_me->def;
- if (old_def == def) return old_me;
+ if (rb_method_definition_eq(old_def, def)) return old_me;
rb_vm_check_redefinition_opt_method(old_me);
if (RTEST(ruby_verbose) &&
@@ -791,7 +793,12 @@ rb_mod_protected_method_defined(VALUE mod, VALUE mid)
int
rb_method_entry_eq(const rb_method_entry_t *m1, const rb_method_entry_t *m2)
{
- const rb_method_definition_t *d1 = m1->def, *d2 = m2->def;
+ return rb_method_definition_eq(m1->def, m2->def);
+}
+
+static int
+rb_method_definition_eq(const rb_method_definition_t *d1, const rb_method_definition_t *d2)
+{
if (!d1) {
return !d2;
}