diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-04-24 03:08:49 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-04-24 03:08:49 +0000 |
commit | a680ee9ffa6eeaafd6efe52edbe5ed00e8620cb0 (patch) | |
tree | 76ce51422e2a1e6161540052955964012f5c7f04 /parse.y | |
parent | e923de6d4ac7fca1d0a3d39c3df43015cd4b03f2 (diff) | |
download | ruby-a680ee9ffa6eeaafd6efe52edbe5ed00e8620cb0.tar.gz |
parse.y: check for symbol
* parse.y (rb_sym2id, rb_sym2id_without_pindown): reject
non-symbol values.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45702 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r-- | parse.y | 21 |
1 files changed, 13 insertions, 8 deletions
@@ -10768,17 +10768,24 @@ lookup_id_str(ID id, st_data_t *data) return FALSE; } +static void +must_be_dynamic_symbol(VALUE x) +{ + if (SPECIAL_CONST_P(x) || BUILTIN_TYPE(x) != T_SYMBOL) { + rb_raise(rb_eTypeError, "wrong argument type %s (expected Symbol)", + rb_builtin_class_name(x)); + } +} + ID rb_sym2id(VALUE x) { if (STATIC_SYM_P(x)) { return RSHIFT((unsigned long)(x),RUBY_SPECIAL_SHIFT); } - else if (!SPECIAL_CONST_P(x) && BUILTIN_TYPE(x) == T_SYMBOL) { - return rb_pin_dynamic_symbol(x); - } else { - return 0; + must_be_dynamic_symbol(x); + return rb_pin_dynamic_symbol(x); } } @@ -10788,11 +10795,9 @@ rb_sym2id_without_pindown(VALUE x) if (STATIC_SYM_P(x)) { return RSHIFT((unsigned long)(x),RUBY_SPECIAL_SHIFT); } - else if (!SPECIAL_CONST_P(x) && BUILTIN_TYPE(x) == T_SYMBOL) { - return (ID)x; - } else { - return 0; + must_be_dynamic_symbol(x); + return (ID)x; } } |