summaryrefslogtreecommitdiff
path: root/vm_method.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-07-22 12:06:42 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-07-22 12:06:42 +0000
commit34918aa83260246e545911efe6e1672507c3e699 (patch)
tree8815d9f98358df4f59fc18a49a43e2a81f03e7d3 /vm_method.c
parentc276b7380499eb5b181eca838ec86fc480d4ac94 (diff)
* object.c (rb_mod_{const,cvar}_defined, rb_obj_ivar_defined):
avoid inadvertent symbol creation in reflection methods. based on a patch by Jeremy Evans at [ruby-core:38367]. [Feature #5072] * vm_method.c (rb_mod_method_defined) (rb_mod_{public,private,protected}_method_defined) (obj_respond_to): ditto. * parse.y (rb_check_id): new function returns already interned ID or 0. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@32621 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_method.c')
-rw-r--r--vm_method.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/vm_method.c b/vm_method.c
index 218d51f431..cea26cdc31 100644
--- a/vm_method.c
+++ b/vm_method.c
@@ -713,7 +713,8 @@ rb_mod_undef_method(int argc, VALUE *argv, VALUE mod)
static VALUE
rb_mod_method_defined(VALUE mod, VALUE mid)
{
- if (!rb_method_boundp(mod, rb_to_id(mid), 1)) {
+ ID id = rb_check_id(mid);
+ if (!id || !rb_method_boundp(mod, id, 1)) {
return Qfalse;
}
return Qtrue;
@@ -763,7 +764,9 @@ check_definition(VALUE mod, ID mid, rb_method_flag_t noex)
static VALUE
rb_mod_public_method_defined(VALUE mod, VALUE mid)
{
- return check_definition(mod, rb_to_id(mid), NOEX_PUBLIC);
+ ID id = rb_check_id(mid);
+ if (!id) return Qfalse;
+ return check_definition(mod, id, NOEX_PUBLIC);
}
/*
@@ -795,7 +798,9 @@ rb_mod_public_method_defined(VALUE mod, VALUE mid)
static VALUE
rb_mod_private_method_defined(VALUE mod, VALUE mid)
{
- return check_definition(mod, rb_to_id(mid), NOEX_PRIVATE);
+ ID id = rb_check_id(mid);
+ if (!id) return Qfalse;
+ return check_definition(mod, id, NOEX_PRIVATE);
}
/*
@@ -827,7 +832,9 @@ rb_mod_private_method_defined(VALUE mod, VALUE mid)
static VALUE
rb_mod_protected_method_defined(VALUE mod, VALUE mid)
{
- return check_definition(mod, rb_to_id(mid), NOEX_PROTECTED);
+ ID id = rb_check_id(mid);
+ if (!id) return Qfalse;
+ return check_definition(mod, id, NOEX_PROTECTED);
}
int
@@ -1238,7 +1245,8 @@ obj_respond_to(int argc, VALUE *argv, VALUE obj)
ID id;
rb_scan_args(argc, argv, "11", &mid, &priv);
- id = rb_to_id(mid);
+ if (!(id = rb_check_id(mid)))
+ return Qfalse;
if (basic_obj_respond_to(obj, id, !RTEST(priv)))
return Qtrue;
return Qfalse;