diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-03-28 12:36:26 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-03-28 12:36:26 +0000 |
commit | fd8f3cb98718be52976753e4580213b6062c2949 (patch) | |
tree | 40e0cd3f44a1c76f0e894b013573d4375dea3cfb /parse.y | |
parent | 4a46362239ca151be428f1db799c491f09d7403b (diff) |
parse.y: rb_id_attrget
* parse.y (rb_id_attrget): new function to convert setter ID to
getter ID.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45464 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r-- | parse.y | 21 |
1 files changed, 20 insertions, 1 deletions
@@ -8820,6 +8820,7 @@ static const char id_type_names[][9] = { }; static ID rb_pin_dynamic_symbol(VALUE); +static ID attrsetname_to_attr(VALUE name); ID rb_id_attrset(ID id) @@ -8861,6 +8862,12 @@ rb_id_attrset(ID id) return id; } +ID +rb_id_attrget(ID id) +{ + return attrsetname_to_attr(rb_id2str(id)); +} + static NODE * attrset_gen(struct parser_params *parser, NODE *recv, ID id) { @@ -10991,7 +10998,19 @@ rb_check_id_without_pindown(VALUE *namep) if (st_lookup(global_symbols.sym_id, (st_data_t)name, &id)) return (ID)id; + { + ID gid = attrsetname_to_attr(name); + if (gid) return rb_id_attrset(gid); + } + + return (ID)0; +} + +static ID +attrsetname_to_attr(VALUE name) +{ if (rb_is_attrset_name(name)) { + st_data_t id; struct RString fake_str; /* make local name by chopping '=' */ const VALUE localname = setup_fake_str(&fake_str, RSTRING_PTR(name), RSTRING_LEN(name) - 1); @@ -10999,7 +11018,7 @@ rb_check_id_without_pindown(VALUE *namep) OBJ_FREEZE(localname); if (st_lookup(global_symbols.sym_id, (st_data_t)localname, &id)) { - return rb_id_attrset((ID)id); + return (ID)id; } RB_GC_GUARD(name); } |