summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-04-11 13:31:23 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-04-11 13:31:23 +0000
commitdb5265a82c221887faf0dfd0d04e47cf11a08e3a (patch)
treea8d54a47508d0e890f102faa4705ce73562f0941 /parse.y
parenta5d1da5d74560c812acb8db6242e389d2f27e368 (diff)
* parse.y (rb_check_id_cstr): new function to check if ID is
registered with NUL-terminated C string. * sprintf.c (rb_str_format): avoid inadvertent symbol creation. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35300 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y28
1 files changed, 28 insertions, 0 deletions
diff --git a/parse.y b/parse.y
index eaee57e4ad..5d8cc08a74 100644
--- a/parse.y
+++ b/parse.y
@@ -10336,6 +10336,34 @@ rb_check_id(volatile VALUE *namep)
return (ID)0;
}
+ID
+rb_check_id_cstr(const char *ptr, long len, rb_encoding *enc)
+{
+ st_data_t id;
+ struct RString fake_str;
+ const VALUE name = (VALUE)&fake_str;
+ fake_str.basic.flags = T_STRING|RSTRING_NOEMBED;
+ fake_str.basic.klass = rb_cString;
+ fake_str.as.heap.len = len;
+ fake_str.as.heap.ptr = (char *)ptr;
+ fake_str.as.heap.aux.capa = len;
+ rb_enc_associate(name, enc);
+
+ sym_check_asciionly(name);
+
+ if (st_lookup(global_symbols.sym_id, (st_data_t)name, &id))
+ return (ID)id;
+
+ if (rb_is_attrset_name(name)) {
+ fake_str.as.heap.len = len - 1;
+ if (st_lookup(global_symbols.sym_id, (st_data_t)name, &id)) {
+ return rb_id_attrset((ID)id);
+ }
+ }
+
+ return (ID)0;
+}
+
int
rb_is_const_name(VALUE name)
{