summaryrefslogtreecommitdiff
path: root/vm_method.c
diff options
context:
space:
mode:
authorkazu <kazu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-08-13 13:27:47 +0000
committerkazu <kazu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-08-13 13:27:47 +0000
commitee05c56752b01695fe7b5c4bebe80c3e6fd4f354 (patch)
tree55e307edb811df1fec2b6638c3db5f2303e9c9c3 /vm_method.c
parent5bf3db3efbc92f92dcd4c6624004c4385184bc47 (diff)
Revert "Support optional inherit argument for Module#method_defined?"
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64340 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_method.c')
-rw-r--r--vm_method.c134
1 files changed, 54 insertions, 80 deletions
diff --git a/vm_method.c b/vm_method.c
index a7cb6f66a9..8cf7cf7204 100644
--- a/vm_method.c
+++ b/vm_method.c
@@ -1278,43 +1278,14 @@ rb_mod_undef_method(int argc, VALUE *argv, VALUE mod)
return mod;
}
-static rb_method_visibility_t
-check_definition_visibility(VALUE mod, int argc, VALUE *argv)
-{
- const rb_method_entry_t *me;
- VALUE mid, include_super, lookup_mod = mod;
- int inc_super;
- ID id;
-
- rb_scan_args(argc, argv, "11", &mid, &include_super);
- id = rb_check_id(&mid);
- if (!id) return METHOD_VISI_UNDEF;
-
- if (argc == 1) {
- inc_super = 1;
- } else {
- inc_super = RTEST(include_super);
- if (!inc_super) {
- lookup_mod = RCLASS_ORIGIN(mod);
- }
- }
-
- me = rb_method_entry_without_refinements(lookup_mod, id, NULL);
- if (me) {
- if (!inc_super && me->owner != mod) return METHOD_VISI_UNDEF;
- return METHOD_ENTRY_VISI(me);
- }
- return METHOD_VISI_UNDEF;
-}
-
/*
* call-seq:
- * mod.method_defined?(symbol, inherit=true) -> true or false
- * mod.method_defined?(string, inherit=true) -> true or false
+ * mod.method_defined?(symbol) -> true or false
+ * mod.method_defined?(string) -> true or false
*
* Returns +true+ if the named method is defined by
- * _mod_. If _inherit_ is set, the lookup will also search _mod_'s
- * ancestors. Public and protected methods are matched.
+ * _mod_ (or its included modules and, if _mod_ is a class,
+ * its ancestors). Public and protected methods are matched.
* String arguments are converted to symbols.
*
* module A
@@ -1335,8 +1306,6 @@ check_definition_visibility(VALUE mod, int argc, VALUE *argv)
* A.method_defined? :method1 #=> true
* C.method_defined? "method1" #=> true
* C.method_defined? "method2" #=> true
- * C.method_defined? "method2", true #=> true
- * C.method_defined? "method2", false #=> false
* C.method_defined? "method3" #=> true
* C.method_defined? "protected_method1" #=> true
* C.method_defined? "method4" #=> false
@@ -1344,26 +1313,37 @@ check_definition_visibility(VALUE mod, int argc, VALUE *argv)
*/
static VALUE
-rb_mod_method_defined(int argc, VALUE *argv, VALUE mod)
+rb_mod_method_defined(VALUE mod, VALUE mid)
{
- rb_method_visibility_t visi = check_definition_visibility(mod, argc, argv);
- return (visi == METHOD_VISI_PUBLIC || visi == METHOD_VISI_PROTECTED) ? Qtrue : Qfalse;
+ ID id = rb_check_id(&mid);
+ if (!id || !rb_method_boundp(mod, id, 1)) {
+ return Qfalse;
+ }
+ return Qtrue;
+
}
static VALUE
-check_definition(VALUE mod, int argc, VALUE *argv, rb_method_visibility_t visi)
+check_definition(VALUE mod, VALUE mid, rb_method_visibility_t visi)
{
- return (check_definition_visibility(mod, argc, argv) == visi) ? Qtrue : Qfalse;
+ const rb_method_entry_t *me;
+ ID id = rb_check_id(&mid);
+ if (!id) return Qfalse;
+ me = rb_method_entry_without_refinements(mod, id, NULL);
+ if (me) {
+ if (METHOD_ENTRY_VISI(me) == visi) return Qtrue;
+ }
+ return Qfalse;
}
/*
* call-seq:
- * mod.public_method_defined?(symbol, inherit=true) -> true or false
- * mod.public_method_defined?(string, inherit=true) -> true or false
+ * mod.public_method_defined?(symbol) -> true or false
+ * mod.public_method_defined?(string) -> true or false
*
* Returns +true+ if the named public method is defined by
- * _mod_. If _inherit_ is set, the lookup will also search _mod_'s
- * ancestors.
+ * _mod_ (or its included modules and, if _mod_ is a class,
+ * its ancestors).
* String arguments are converted to symbols.
*
* module A
@@ -1378,28 +1358,26 @@ check_definition(VALUE mod, int argc, VALUE *argv, rb_method_visibility_t visi)
* def method3() end
* end
*
- * A.method_defined? :method1 #=> true
- * C.public_method_defined? "method1" #=> true
- * C.public_method_defined? "method1", true #=> true
- * C.public_method_defined? "method1", false #=> true
- * C.public_method_defined? "method2" #=> false
- * C.method_defined? "method2" #=> true
+ * A.method_defined? :method1 #=> true
+ * C.public_method_defined? "method1" #=> true
+ * C.public_method_defined? "method2" #=> false
+ * C.method_defined? "method2" #=> true
*/
static VALUE
-rb_mod_public_method_defined(int argc, VALUE *argv, VALUE mod)
+rb_mod_public_method_defined(VALUE mod, VALUE mid)
{
- return check_definition(mod, argc, argv, METHOD_VISI_PUBLIC);
+ return check_definition(mod, mid, METHOD_VISI_PUBLIC);
}
/*
* call-seq:
- * mod.private_method_defined?(symbol, inherit=true) -> true or false
- * mod.private_method_defined?(string, inherit=true) -> true or false
+ * mod.private_method_defined?(symbol) -> true or false
+ * mod.private_method_defined?(string) -> true or false
*
* Returns +true+ if the named private method is defined by
- * _mod_. If _inherit_ is set, the lookup will also search _mod_'s
- * ancestors.
+ * _ mod_ (or its included modules and, if _mod_ is a class,
+ * its ancestors).
* String arguments are converted to symbols.
*
* module A
@@ -1414,28 +1392,26 @@ rb_mod_public_method_defined(int argc, VALUE *argv, VALUE mod)
* def method3() end
* end
*
- * A.method_defined? :method1 #=> true
- * C.private_method_defined? "method1" #=> false
- * C.private_method_defined? "method2" #=> true
- * C.private_method_defined? "method2", true #=> true
- * C.private_method_defined? "method2", false #=> false
- * C.method_defined? "method2" #=> false
+ * A.method_defined? :method1 #=> true
+ * C.private_method_defined? "method1" #=> false
+ * C.private_method_defined? "method2" #=> true
+ * C.method_defined? "method2" #=> false
*/
static VALUE
-rb_mod_private_method_defined(int argc, VALUE *argv, VALUE mod)
+rb_mod_private_method_defined(VALUE mod, VALUE mid)
{
- return check_definition(mod, argc, argv, METHOD_VISI_PRIVATE);
+ return check_definition(mod, mid, METHOD_VISI_PRIVATE);
}
/*
* call-seq:
- * mod.protected_method_defined?(symbol, inherit=true) -> true or false
- * mod.protected_method_defined?(string, inherit=true) -> true or false
+ * mod.protected_method_defined?(symbol) -> true or false
+ * mod.protected_method_defined?(string) -> true or false
*
* Returns +true+ if the named protected method is defined
- * _mod_. If _inherit_ is set, the lookup will also search _mod_'s
- * ancestors.
+ * by _mod_ (or its included modules and, if _mod_ is a
+ * class, its ancestors).
* String arguments are converted to symbols.
*
* module A
@@ -1450,18 +1426,16 @@ rb_mod_private_method_defined(int argc, VALUE *argv, VALUE mod)
* def method3() end
* end
*
- * A.method_defined? :method1 #=> true
- * C.protected_method_defined? "method1" #=> false
- * C.protected_method_defined? "method2" #=> true
- * C.protected_method_defined? "method2", true #=> true
- * C.protected_method_defined? "method2", false #=> false
- * C.method_defined? "method2" #=> true
+ * A.method_defined? :method1 #=> true
+ * C.protected_method_defined? "method1" #=> false
+ * C.protected_method_defined? "method2" #=> true
+ * C.method_defined? "method2" #=> true
*/
static VALUE
-rb_mod_protected_method_defined(int argc, VALUE *argv, VALUE mod)
+rb_mod_protected_method_defined(VALUE mod, VALUE mid)
{
- return check_definition(mod, argc, argv, METHOD_VISI_PROTECTED);
+ return check_definition(mod, mid, METHOD_VISI_PROTECTED);
}
int
@@ -2147,10 +2121,10 @@ Init_eval_method(void)
rb_define_private_method(rb_cModule, "private", rb_mod_private, -1);
rb_define_private_method(rb_cModule, "module_function", rb_mod_modfunc, -1);
- rb_define_method(rb_cModule, "method_defined?", rb_mod_method_defined, -1);
- rb_define_method(rb_cModule, "public_method_defined?", rb_mod_public_method_defined, -1);
- rb_define_method(rb_cModule, "private_method_defined?", rb_mod_private_method_defined, -1);
- rb_define_method(rb_cModule, "protected_method_defined?", rb_mod_protected_method_defined, -1);
+ rb_define_method(rb_cModule, "method_defined?", rb_mod_method_defined, 1);
+ rb_define_method(rb_cModule, "public_method_defined?", rb_mod_public_method_defined, 1);
+ rb_define_method(rb_cModule, "private_method_defined?", rb_mod_private_method_defined, 1);
+ rb_define_method(rb_cModule, "protected_method_defined?", rb_mod_protected_method_defined, 1);
rb_define_method(rb_cModule, "public_class_method", rb_mod_public_method, -1);
rb_define_method(rb_cModule, "private_class_method", rb_mod_private_method, -1);