diff options
| author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2025-03-17 21:37:00 +0900 |
|---|---|---|
| committer | Nobuyoshi Nakada <nobu.nakada@gmail.com> | 2025-03-17 23:55:11 +0900 |
| commit | 1acfb29015dbc38fd345d8786aa78aad59f7dcd1 (patch) | |
| tree | 32ccffd0b6d74f52eacceb89f5edae7b521e3bed /parse.y | |
| parent | c85dffeee2f1899e0db3bde6a4fb49bc90c90ec2 (diff) | |
[Bug #21186] multibyte char literal should be a single letter word
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/12946
Diffstat (limited to 'parse.y')
| -rw-r--r-- | parse.y | 13 |
1 files changed, 6 insertions, 7 deletions
@@ -9914,6 +9914,7 @@ parse_qmark(struct parser_params *p, int space_seen) rb_encoding *enc; register int c; rb_parser_string_t *lit; + const char *start = p->lex.pcur; if (IS_END()) { SET_LEX_STATE(EXPR_VALUE); @@ -9938,13 +9939,11 @@ parse_qmark(struct parser_params *p, int space_seen) } newtok(p); enc = p->enc; - if (!parser_isascii(p)) { - if (tokadd_mbchar(p, c) == -1) return 0; - } - else if ((rb_enc_isalnum(c, p->enc) || c == '_') && - !lex_eol_p(p) && is_identchar(p, p->lex.pcur, p->lex.pend, p->enc)) { + int w = parser_precise_mbclen(p, start); + if (is_identchar(p, start, p->lex.pend, p->enc) && + !(lex_eol_ptr_n_p(p, start, w) || !is_identchar(p, start + w, p->lex.pend, p->enc))) { if (space_seen) { - const char *start = p->lex.pcur - 1, *ptr = start; + const char *ptr = start; do { int n = parser_precise_mbclen(p, ptr); if (n < 0) return -1; @@ -9972,7 +9971,7 @@ parse_qmark(struct parser_params *p, int space_seen) } } else { - tokadd(p, c); + if (tokadd_mbchar(p, c) == -1) return 0; } tokfix(p); lit = STR_NEW3(tok(p), toklen(p), enc, 0); |
