@@ -9884,6 +9884,7 @@ parse_qmark(struct parser_params *p, int space_seen)
9884
9884
rb_encoding *enc;
9885
9885
register int c;
9886
9886
VALUE lit;
9887
+ const char *start = p->lex.pcur;
9887
9888
9888
9889
if (IS_END()) {
9889
9890
SET_LEX_STATE(EXPR_VALUE);
@@ -9908,13 +9909,11 @@ parse_qmark(struct parser_params *p, int space_seen)
9908
9909
}
9909
9910
newtok(p);
9910
9911
enc = p->enc;
9911
- if (!parser_isascii(p)) {
9912
- if (tokadd_mbchar(p, c) == -1) return 0;
9913
- }
9914
- else if ((rb_enc_isalnum(c, p->enc) || c == '_') &&
9915
- !lex_eol_p(p) && is_identchar(p, p->lex.pcur, p->lex.pend, p->enc)) {
9912
+ int w = parser_precise_mbclen(p, start);
9913
+ if (is_identchar(p, start, p->lex.pend, p->enc) &&
9914
+ !(lex_eol_ptr_n_p(p, start, w) || !is_identchar(p, start + w, p->lex.pend, p->enc))) {
9916
9915
if (space_seen) {
9917
- const char *start = p->lex.pcur - 1, * ptr = start;
9916
+ const char *ptr = start;
9918
9917
do {
9919
9918
int n = parser_precise_mbclen(p, ptr);
9920
9919
if (n < 0) return -1;
@@ -9942,7 +9941,7 @@ parse_qmark(struct parser_params *p, int space_seen)
9942
9941
}
9943
9942
}
9944
9943
else {
9945
- tokadd( p, c);
9944
+ if (tokadd_mbchar( p, c) == -1) return 0 ;
9946
9945
}
9947
9946
tokfix(p);
9948
9947
lit = STR_NEW3(tok(p), toklen(p), enc, 0);
0 commit comments