[Bug #21186] multibyte char literal should be a single letter word
This commit is contained in:
parent
c85dffeee2
commit
1acfb29015
Notes:
git
2025-03-17 14:55:29 +00:00
13
parse.y
13
parse.y
@ -9914,6 +9914,7 @@ parse_qmark(struct parser_params *p, int space_seen)
|
|||||||
rb_encoding *enc;
|
rb_encoding *enc;
|
||||||
register int c;
|
register int c;
|
||||||
rb_parser_string_t *lit;
|
rb_parser_string_t *lit;
|
||||||
|
const char *start = p->lex.pcur;
|
||||||
|
|
||||||
if (IS_END()) {
|
if (IS_END()) {
|
||||||
SET_LEX_STATE(EXPR_VALUE);
|
SET_LEX_STATE(EXPR_VALUE);
|
||||||
@ -9938,13 +9939,11 @@ parse_qmark(struct parser_params *p, int space_seen)
|
|||||||
}
|
}
|
||||||
newtok(p);
|
newtok(p);
|
||||||
enc = p->enc;
|
enc = p->enc;
|
||||||
if (!parser_isascii(p)) {
|
int w = parser_precise_mbclen(p, start);
|
||||||
if (tokadd_mbchar(p, c) == -1) return 0;
|
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))) {
|
||||||
else if ((rb_enc_isalnum(c, p->enc) || c == '_') &&
|
|
||||||
!lex_eol_p(p) && is_identchar(p, p->lex.pcur, p->lex.pend, p->enc)) {
|
|
||||||
if (space_seen) {
|
if (space_seen) {
|
||||||
const char *start = p->lex.pcur - 1, *ptr = start;
|
const char *ptr = start;
|
||||||
do {
|
do {
|
||||||
int n = parser_precise_mbclen(p, ptr);
|
int n = parser_precise_mbclen(p, ptr);
|
||||||
if (n < 0) return -1;
|
if (n < 0) return -1;
|
||||||
@ -9972,7 +9971,7 @@ parse_qmark(struct parser_params *p, int space_seen)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
tokadd(p, c);
|
if (tokadd_mbchar(p, c) == -1) return 0;
|
||||||
}
|
}
|
||||||
tokfix(p);
|
tokfix(p);
|
||||||
lit = STR_NEW3(tok(p), toklen(p), enc, 0);
|
lit = STR_NEW3(tok(p), toklen(p), enc, 0);
|
||||||
|
@ -657,6 +657,8 @@ class TestParse < Test::Unit::TestCase
|
|||||||
assert_equal("\u{1234}", eval('?\u{1234}'))
|
assert_equal("\u{1234}", eval('?\u{1234}'))
|
||||||
assert_equal("\u{1234}", eval('?\u1234'))
|
assert_equal("\u{1234}", eval('?\u1234'))
|
||||||
assert_syntax_error('?\u{41 42}', 'Multiple codepoints at single character literal')
|
assert_syntax_error('?\u{41 42}', 'Multiple codepoints at single character literal')
|
||||||
|
assert_syntax_error("?and", /unexpected '\?'/)
|
||||||
|
assert_syntax_error("?\u1234and", /unexpected '\?'/)
|
||||||
e = assert_syntax_error('"#{?\u123}"', 'invalid Unicode escape')
|
e = assert_syntax_error('"#{?\u123}"', 'invalid Unicode escape')
|
||||||
assert_not_match(/end-of-input/, e.message)
|
assert_not_match(/end-of-input/, e.message)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user