Project

General

Profile

Feature #7836 ยป 0001-proc.c-include-prepended-method-flag.patch

nobu (Nobuyoshi Nakada), 03/05/2013 08:32 PM

View differences:

proc.c
*/
static VALUE
rb_mod_instance_method(VALUE mod, VALUE vid)
rb_mod_instance_method(int argc, VALUE *argv, VALUE mod)
{
VALUE vid = (rb_check_arity(argc, 1, 2), argv[0]);
int prepended = argc == 1 || RTEST(argv[1]);
ID id = rb_check_id(&vid);
if (!id) {
rb_method_name_error(mod, vid);
}
if (!prepended) mod = RCLASS_ORIGIN(mod);
return mnew(mod, Qundef, id, rb_cUnboundMethod, FALSE);
}
......
*/
static VALUE
rb_mod_public_instance_method(VALUE mod, VALUE vid)
rb_mod_public_instance_method(int argc, VALUE *argv, VALUE mod)
{
VALUE vid = (rb_check_arity(argc, 1, 2), argv[0]);
int prepended = argc == 1 || RTEST(argv[1]);
ID id = rb_check_id(&vid);
if (!id) {
rb_method_name_error(mod, vid);
}
if (!prepended) mod = RCLASS_ORIGIN(mod);
return mnew(mod, Qundef, id, rb_cUnboundMethod, TRUE);
}
......
rb_define_method(rb_cUnboundMethod, "parameters", rb_method_parameters, 0);
/* Module#*_method */
rb_define_method(rb_cModule, "instance_method", rb_mod_instance_method, 1);
rb_define_method(rb_cModule, "public_instance_method", rb_mod_public_instance_method, 1);
rb_define_method(rb_cModule, "instance_method", rb_mod_instance_method, -1);
rb_define_method(rb_cModule, "public_instance_method", rb_mod_public_instance_method, -1);
rb_define_private_method(rb_cModule, "define_method", rb_mod_define_method, -1);
/* Kernel */
test/ruby/test_method.rb
end
def test_prepended
bug7836 = '[ruby-core:52160] [Bug #7836]'
feature7836 = '[ruby-core:52160] [Feature #7836]'
bug7988 = '[ruby-core:53038] [Bug #7988]'
m = Module.new {
def foo
end
def zot
end
}
c = Class.new {
def foo
......
prepend m
}
assert_raise(NameError, bug7988) {Module.new{prepend m}.instance_method(:bar)}
assert_equal(m, c.instance_method(:foo).owner, feature7836)
assert_equal(m, c.instance_method(:foo, true).owner, feature7836)
assert_equal(c, c.instance_method(:foo, false).owner, feature7836)
assert_raise(NameError, feature7836) {c.instance_method(:zot, false)}
end
def test_gced_bmethod
    (1-1/1)