summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-02-12 00:42:37 +0000
committernaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-02-12 00:42:37 +0000
commit7d86051f256eac912e47a205c8e6d6125141a188 (patch)
tree7617b3309e56581b1e051181efa4c8a8a7007bc9
parent16c364121b8fe725087dadad8c19f45a4eddc958 (diff)
merge revision(s) 32527,32567: [Backport #6004]
* vm_method.c (rb_add_method): should not call method_added hook for undef operation. [Bug #5015] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_3@34566 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--test/ruby/test_module.rb58
-rw-r--r--version.h2
-rw-r--r--vm_method.c4
4 files changed, 67 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 1f1646432b..5603523387 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Sun Feb 12 09:38:46 2012 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * vm_method.c (rb_add_method): should not call method_added hook
+ for undef operation. [Bug #5015]
+
Sun Feb 12 09:29:28 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
* regint.h (PLATFORM_UNALIGNED_WORD_ACCESS): Power PC does not
diff --git a/test/ruby/test_module.rb b/test/ruby/test_module.rb
index 3258259cf7..198fcee978 100644
--- a/test/ruby/test_module.rb
+++ b/test/ruby/test_module.rb
@@ -894,6 +894,64 @@ class TestModule < Test::Unit::TestCase
assert_equal mod.instance_method(:a=), memo.shift
end
+ def test_method_undefined
+ added = []
+ undefed = []
+ removed = []
+ mod = Module.new do
+ mod = self
+ def f
+ end
+ (class << self ; self ; end).class_eval do
+ define_method :method_added do |sym|
+ added << sym
+ end
+ define_method :method_undefined do |sym|
+ undefed << sym
+ end
+ define_method :method_removed do |sym|
+ removed << sym
+ end
+ end
+ end
+ assert_method_defined?(mod, :f)
+ mod.module_eval do
+ undef :f
+ end
+ assert_equal [], added
+ assert_equal [:f], undefed
+ assert_equal [], removed
+ end
+
+ def test_method_removed
+ added = []
+ undefed = []
+ removed = []
+ mod = Module.new do
+ mod = self
+ def f
+ end
+ (class << self ; self ; end).class_eval do
+ define_method :method_added do |sym|
+ added << sym
+ end
+ define_method :method_undefined do |sym|
+ undefed << sym
+ end
+ define_method :method_removed do |sym|
+ removed << sym
+ end
+ end
+ end
+ assert_method_defined?(mod, :f)
+ mod.module_eval do
+ remove_method :f
+ end
+ assert_equal [], added
+ assert_equal [], undefed
+ assert_equal [:f], removed
+ end
+
def test_method_redefinition
feature2155 = '[ruby-dev:39400]'
diff --git a/version.h b/version.h
index 2655f1d203..4c461ca89f 100644
--- a/version.h
+++ b/version.h
@@ -1,5 +1,5 @@
#define RUBY_VERSION "1.9.3"
-#define RUBY_PATCHLEVEL 96
+#define RUBY_PATCHLEVEL 97
#define RUBY_RELEASE_DATE "2012-02-12"
#define RUBY_RELEASE_YEAR 2012
diff --git a/vm_method.c b/vm_method.c
index 239b3887cb..7cf816a66a 100644
--- a/vm_method.c
+++ b/vm_method.c
@@ -318,7 +318,9 @@ rb_add_method(VALUE klass, ID mid, rb_method_type_t type, void *opts, rb_method_
default:
rb_bug("rb_add_method: unsupported method type (%d)\n", type);
}
- method_added(klass, mid);
+ if (type != VM_METHOD_TYPE_UNDEF) {
+ method_added(klass, mid);
+ }
return me;
}