mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
parse.y: continue after heredoc error
* parse.y: continue parsing the rest of the here-document starting line, after the terminator was not found.
This commit is contained in:
parent
cb520e7623
commit
4a31c1e45d
2 changed files with 16 additions and 2 deletions
12
parse.y
12
parse.y
|
@ -6016,12 +6016,17 @@ nextline(struct parser_params *p)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (!p->lex.input || NIL_P(v = lex_getline(p))) {
|
if (!p->lex.input || NIL_P(v = lex_getline(p))) {
|
||||||
|
end_of_input:
|
||||||
p->eofp = 1;
|
p->eofp = 1;
|
||||||
lex_goto_eol(p);
|
lex_goto_eol(p);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
p->cr_seen = FALSE;
|
p->cr_seen = FALSE;
|
||||||
}
|
}
|
||||||
|
else if (NIL_P(v)) {
|
||||||
|
/* after here-document without terminator */
|
||||||
|
goto end_of_input;
|
||||||
|
}
|
||||||
add_delayed_token(p, p->lex.ptok, p->lex.pend);
|
add_delayed_token(p, p->lex.ptok, p->lex.pend);
|
||||||
if (p->heredoc_end > 0) {
|
if (p->heredoc_end > 0) {
|
||||||
p->ruby_sourceline = p->heredoc_end;
|
p->ruby_sourceline = p->heredoc_end;
|
||||||
|
@ -6056,7 +6061,7 @@ nextc(struct parser_params *p)
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
if (UNLIKELY((p->lex.pcur == p->lex.pend) || p->eofp || p->lex.nextline)) {
|
if (UNLIKELY((p->lex.pcur == p->lex.pend) || p->eofp || RTEST(p->lex.nextline))) {
|
||||||
if (nextline(p)) return -1;
|
if (nextline(p)) return -1;
|
||||||
}
|
}
|
||||||
c = (unsigned char)*p->lex.pcur++;
|
c = (unsigned char)*p->lex.pcur++;
|
||||||
|
@ -7003,6 +7008,8 @@ heredoc_restore(struct parser_params *p, rb_strterm_heredoc_t *here)
|
||||||
p->heredoc_end = p->ruby_sourceline;
|
p->heredoc_end = p->ruby_sourceline;
|
||||||
p->ruby_sourceline = (int)here->sourceline;
|
p->ruby_sourceline = (int)here->sourceline;
|
||||||
token_flush(p);
|
token_flush(p);
|
||||||
|
if (p->eofp) p->lex.nextline = Qnil;
|
||||||
|
p->eofp = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -7260,7 +7267,8 @@ here_document(struct parser_params *p, rb_strterm_heredoc_t *here)
|
||||||
restore:
|
restore:
|
||||||
heredoc_restore(p, &p->lex.strterm->u.heredoc);
|
heredoc_restore(p, &p->lex.strterm->u.heredoc);
|
||||||
p->lex.strterm = 0;
|
p->lex.strterm = 0;
|
||||||
return 0;
|
SET_LEX_STATE(EXPR_END);
|
||||||
|
return tSTRING_END;
|
||||||
}
|
}
|
||||||
bol = was_bol(p);
|
bol = was_bol(p);
|
||||||
if (!bol) {
|
if (!bol) {
|
||||||
|
|
|
@ -901,6 +901,12 @@ eom
|
||||||
assert_syntax_error("puts <<""EOS\n""ng\n""EOS\r""NO\n", /can't find string "EOS" anywhere before EOF/)
|
assert_syntax_error("puts <<""EOS\n""ng\n""EOS\r""NO\n", /can't find string "EOS" anywhere before EOF/)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_heredoc_no_terminator
|
||||||
|
assert_syntax_error("puts <<""A\n", /can't find string "A" anywhere before EOF/)
|
||||||
|
assert_syntax_error("puts <<""A + <<""B\n", /can't find string "A" anywhere before EOF/)
|
||||||
|
assert_syntax_error("puts <<""A + <<""B\n", /can't find string "B" anywhere before EOF/)
|
||||||
|
end
|
||||||
|
|
||||||
def test_unterminated_heredoc
|
def test_unterminated_heredoc
|
||||||
assert_syntax_error("<<\"EOS\n\nEOS\n", /unterminated/)
|
assert_syntax_error("<<\"EOS\n\nEOS\n", /unterminated/)
|
||||||
assert_syntax_error("<<\"EOS\n\"\nEOS\n", /unterminated/)
|
assert_syntax_error("<<\"EOS\n\"\nEOS\n", /unterminated/)
|
||||||
|
|
Loading…
Reference in a new issue