1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Fixed embedded document with EOF char

This commit is contained in:
Nobuyoshi Nakada 2019-11-11 09:35:37 +09:00
parent b42656b9c4
commit ade0388894
No known key found for this signature in database
GPG key ID: 4BC7D6DF58D8DF60
2 changed files with 25 additions and 4 deletions

20
parse.y
View file

@ -7391,6 +7391,19 @@ whole_match_p(struct parser_params *p, const char *eos, long len, int indent)
return strncmp(eos, ptr, len) == 0;
}
static int
word_match_p(struct parser_params *p, const char *word, long len)
{
if (strncmp(p->lex.pcur, word, len)) return 0;
if (p->lex.pcur + len == p->lex.pend) return 1;
int c = (unsigned char)p->lex.pcur[len];
if (ISSPACE(c)) return 1;
switch (c) {
case '\0': case '\004': case '\032': return 1;
}
return 0;
}
#define NUM_SUFFIX_R (1<<0)
#define NUM_SUFFIX_I (1<<1)
#define NUM_SUFFIX_ALL 3
@ -8976,7 +8989,7 @@ parser_yylex(struct parser_params *p)
case '=':
if (was_bol(p)) {
/* skip embedded rd document */
if (strncmp(p->lex.pcur, "begin", 5) == 0 && ISSPACE(p->lex.pcur[5])) {
if (word_match_p(p, "begin", 5)) {
int first_p = TRUE;
lex_goto_eol(p);
@ -8992,11 +9005,10 @@ parser_yylex(struct parser_params *p)
compile_error(p, "embedded document meets end of file");
return 0;
}
if (c != '=') continue;
if (c == '=' && strncmp(p->lex.pcur, "end", 3) == 0 &&
(p->lex.pcur + 3 == p->lex.pend || ISSPACE(p->lex.pcur[3]))) {
if (c == '=' && word_match_p(p, "end", 3)) {
break;
}
pushback(p, c);
}
lex_goto_eol(p);
dispatch_scan_event(p, tEMBDOC_END);

View file

@ -709,6 +709,15 @@ x = __ENCODING__
def test_embedded_rd
assert_valid_syntax("=begin\n""=end")
assert_valid_syntax("=begin\n""=end\0")
assert_valid_syntax("=begin\n""=end\C-d")
assert_valid_syntax("=begin\n""=end\C-z")
end
def test_embedded_rd_error
error = 'embedded document meets end of file'
assert_syntax_error("=begin\n", error)
assert_syntax_error("=begin", error)
end
def test_float