diff options
author | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-02-12 00:42:37 +0000 |
---|---|---|
committer | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-02-12 00:42:37 +0000 |
commit | 7d86051f256eac912e47a205c8e6d6125141a188 (patch) | |
tree | 7617b3309e56581b1e051181efa4c8a8a7007bc9 | |
parent | 16c364121b8fe725087dadad8c19f45a4eddc958 (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-- | ChangeLog | 5 | ||||
-rw-r--r-- | test/ruby/test_module.rb | 58 | ||||
-rw-r--r-- | version.h | 2 | ||||
-rw-r--r-- | vm_method.c | 4 |
4 files changed, 67 insertions, 2 deletions
@@ -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]' @@ -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; } |