diff options
-rw-r--r-- | test/ruby/test_exception.rb | 1 | ||||
-rw-r--r-- | test/ruby/test_integer.rb | 2 | ||||
-rw-r--r-- | test/ruby/test_object.rb | 1 | ||||
-rw-r--r-- | vm_method.c | 10 |
4 files changed, 11 insertions, 3 deletions
diff --git a/test/ruby/test_exception.rb b/test/ruby/test_exception.rb index 88b02293e8..3582cb3de3 100644 --- a/test/ruby/test_exception.rb +++ b/test/ruby/test_exception.rb @@ -1344,6 +1344,7 @@ $stderr = $stdout; raise "\x82\xa0"') do |outs, errs, status| def test_super_in_method_missing assert_separately([], "#{<<~"begin;"}\n#{<<~'end;'}") begin; + $VERBOSE = nil class Object def method_missing(name, *args, &block) super diff --git a/test/ruby/test_integer.rb b/test/ruby/test_integer.rb index a991683773..a73992787d 100644 --- a/test/ruby/test_integer.rb +++ b/test/ruby/test_integer.rb @@ -188,7 +188,7 @@ class TestInteger < Test::Unit::TestCase assert_separately([], "#{<<~"begin;"}\n#{<<~'end;'}") begin; - def method_missing(*);"";end + class Integer;def method_missing(*);"";end;end assert_equal(0, Integer("0", 2)) end; end diff --git a/test/ruby/test_object.rb b/test/ruby/test_object.rb index c25dcf9c37..28e07162d7 100644 --- a/test/ruby/test_object.rb +++ b/test/ruby/test_object.rb @@ -883,6 +883,7 @@ class TestObject < Test::Unit::TestCase ['ArgumentError.new("bug5473")', 'ArgumentError, "bug5473"', '"bug5473"'].each do |code| exc = code[/\A[A-Z]\w+/] || 'RuntimeError' assert_separately([], <<-SRC) + $VERBOSE = nil class ::Object def method_missing(m, *a, &b) raise #{code} diff --git a/vm_method.c b/vm_method.c index 697621258c..ffe6f12166 100644 --- a/vm_method.c +++ b/vm_method.c @@ -605,8 +605,14 @@ rb_method_entry_make(VALUE klass, ID mid, VALUE defined_class, rb_method_visibil rb_clear_method_cache_by_class(klass); /* check mid */ - if (klass == rb_cObject && mid == idInitialize) { - rb_warn("redefining Object#initialize may cause infinite loop"); + if (klass == rb_cObject) { + switch (mid) { + case idInitialize: + case idRespond_to_missing: + case idMethodMissing: + case idRespond_to: + rb_warn("redefining Object#%s may cause infinite loop", rb_id2name(mid)); + } } /* check mid */ if (mid == object_id || mid == id__send__) { |