1
0
Fork 0
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:
Nobuyoshi Nakada 2019-05-30 12:35:27 +09:00
parent cb520e7623
commit 4a31c1e45d
No known key found for this signature in database
GPG key ID: 4BC7D6DF58D8DF60
2 changed files with 16 additions and 2 deletions

12
parse.y
View file

@ -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) {

View file

@ -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/)