vm_method.c: drop include_all flag

* vm_method.c (rb_obj_respond_to): drop optional include_all flag if
  respond_to? method is defined in old style.  [Bug #7722]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39069 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2013-02-05 07:25:27 +00:00
Родитель 8efeb603fe
Коммит a106b310e5
3 изменённых файлов: 35 добавлений и 1 удалений

Просмотреть файл

@ -1,3 +1,8 @@
Tue Feb 5 16:25:25 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
* vm_method.c (rb_obj_respond_to): drop optional include_all flag if
respond_to? method is defined in old style. [Bug #7722]
Tue Feb 05 15:04:34 2013 Koichi Sasada <ko1@atdot.net>
* proc.c (rb_binding_new_with_cfp): permit to create binding object

Просмотреть файл

@ -550,4 +550,16 @@ class TestMarshal < Test::Unit::TestCase
assert_raise(TypeError) {Marshal.load("\x04\x08IM\x1cTestMarshal::TestModule\x06:\x0e@ivar_bug\"\x08bug")}
assert_not_operator(TestModule, :instance_variable_defined?, :@bug)
end
class TestForRespondToFalse
def respond_to?(a)
false
end
end
def test_marshal_respond_to_arity
assert_nothing_raised(ArgumentError, '[Bug #7722]') do
Marshal.dump(TestForRespondToFalse.new)
end
end
end

Просмотреть файл

@ -1521,7 +1521,24 @@ rb_obj_respond_to(VALUE obj, ID id, int priv)
return basic_obj_respond_to(obj, id, !RTEST(priv));
}
else {
return RTEST(rb_funcall(obj, idRespond_to, priv ? 2 : 1, ID2SYM(id), Qtrue));
int argc = 1;
VALUE args[2];
args[0] = ID2SYM(id);
args[1] = Qtrue;
if (priv) {
if (rb_obj_method_arity(obj, idRespond_to) != 1) {
argc = 2;
}
else {
VALUE klass = CLASS_OF(obj);
rb_warn("%"PRIsVALUE"%c""respond_to?(:%"PRIsVALUE") is"
" old fashion which takes only one parameter",
(FL_TEST(klass, FL_SINGLETON) ? obj : klass),
(FL_TEST(klass, FL_SINGLETON) ? '.' : '#'),
QUOTE_ID(id));
}
}
return RTEST(rb_funcall2(obj, idRespond_to, argc, args));
}
}