[ruby/prism] Fix infinite loop in error recovery
When recovering from a depth error that occurs at the end of the file, we need to break out of parsing statements. Fixes [Bug #21114] https://github.com/ruby/prism/commit/a32e268787
This commit is contained in:
parent
2b92172894
commit
b21e1aed2e
@ -13948,6 +13948,15 @@ parse_statements(pm_parser_t *parser, pm_context_t context, uint16_t depth) {
|
|||||||
if (PM_NODE_TYPE_P(node, PM_MISSING_NODE)) {
|
if (PM_NODE_TYPE_P(node, PM_MISSING_NODE)) {
|
||||||
parser_lex(parser);
|
parser_lex(parser);
|
||||||
|
|
||||||
|
// If we are at the end of the file, then we need to stop parsing
|
||||||
|
// the statements entirely at this point. Mark the parser as
|
||||||
|
// recovering, as we know that EOF closes the top-level context, and
|
||||||
|
// then break out of the loop.
|
||||||
|
if (match1(parser, PM_TOKEN_EOF)) {
|
||||||
|
parser->recovering = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
while (accept2(parser, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON));
|
while (accept2(parser, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON));
|
||||||
if (context_terminator(context, &parser->current)) break;
|
if (context_terminator(context, &parser->current)) break;
|
||||||
} else if (!accept2(parser, PM_TOKEN_NEWLINE, PM_TOKEN_EOF)) {
|
} else if (!accept2(parser, PM_TOKEN_NEWLINE, PM_TOKEN_EOF)) {
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
x.each { x end
|
x.each { x end
|
||||||
^~~ unexpected 'end', expecting end-of-input
|
^~~ unexpected 'end', expecting end-of-input
|
||||||
^~~ unexpected 'end', ignoring it
|
^~~ unexpected 'end', ignoring it
|
||||||
^ unexpected end-of-input, assuming it is closing the parent top level context
|
|
||||||
^ expected a block beginning with `{` to end with `}`
|
^ expected a block beginning with `{` to end with `}`
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user