summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-12-20 05:43:15 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-12-20 05:43:15 +0000
commitf89238ec0d689f3989c55c4716da500b8c898900 (patch)
treeddf409196264dc90a3b096e7940f6bd8c5a21ae1 /parse.y
parent766f9b4aff57b05a19589c55850d1a73f49d5d06 (diff)
parse.y: ignore constant name captures
* parse.y (reg_named_capture_assign_iter): ignore non-local name captures, including non-ASCII constant names. [ruby-dev:50719] [Bug #15437] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66463 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y9
1 files changed, 5 insertions, 4 deletions
diff --git a/parse.y b/parse.y
index 278c5b0296..09afa6bedd 100644
--- a/parse.y
+++ b/parse.y
@@ -10669,11 +10669,12 @@ reg_named_capture_assign_iter(const OnigUChar *name, const OnigUChar *name_end,
ID var;
NODE *node, *succ;
- if (!len || (*name != '_' && ISASCII(*name) && !rb_enc_islower(*name, enc)) ||
- (len < MAX_WORD_LENGTH && rb_reserved_word(s, (int)len)) ||
- !rb_enc_symname2_p(s, len, enc)) {
+ if (!len) return ST_CONTINUE;
+ if (len < MAX_WORD_LENGTH && rb_reserved_word(s, (int)len))
return ST_CONTINUE;
- }
+ if (rb_enc_symname_type(s, len, enc, (1U<<ID_LOCAL)) != ID_LOCAL)
+ return ST_CONTINUE;
+
var = intern_cstr(s, len, enc);
node = node_assign(p, assignable(p, var, 0, arg->loc), NEW_LIT(ID2SYM(var), arg->loc), arg->loc);
succ = arg->succ_block;