Skip to content

Commit 85e045c

Browse files
committed
No invalid block exits in eval
1 parent 9441839 commit 85e045c

File tree

2 files changed

+13
-4
lines changed

2 files changed

+13
-4
lines changed

include/prism/parser.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -796,6 +796,12 @@ struct pm_parser {
796796
*/
797797
int8_t frozen_string_literal;
798798

799+
/**
800+
* Whether or not we are parsing an eval string. This impacts whether or not
801+
* we should evaluate if block exits/yields are valid.
802+
*/
803+
bool parsing_eval;
804+
799805
/** Whether or not we're at the beginning of a command. */
800806
bool command_start;
801807

src/prism.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17090,12 +17090,12 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
1709017090
switch (keyword.type) {
1709117091
case PM_TOKEN_KEYWORD_BREAK: {
1709217092
pm_node_t *node = (pm_node_t *) pm_break_node_create(parser, &keyword, arguments.arguments);
17093-
parse_block_exit(parser, node, "break");
17093+
if (!parser->parsing_eval) parse_block_exit(parser, node, "break");
1709417094
return node;
1709517095
}
1709617096
case PM_TOKEN_KEYWORD_NEXT: {
1709717097
pm_node_t *node = (pm_node_t *) pm_next_node_create(parser, &keyword, arguments.arguments);
17098-
parse_block_exit(parser, node, "next");
17098+
if (!parser->parsing_eval) parse_block_exit(parser, node, "next");
1709917099
return node;
1710017100
}
1710117101
case PM_TOKEN_KEYWORD_RETURN: {
@@ -17137,7 +17137,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
1713717137
parse_arguments_list(parser, &arguments, false, accepts_command_call);
1713817138

1713917139
pm_node_t *node = (pm_node_t *) pm_yield_node_create(parser, &keyword, &arguments.opening_loc, arguments.arguments, &arguments.closing_loc);
17140-
parse_yield(parser, node);
17140+
if (!parser->parsing_eval) parse_yield(parser, node);
1714117141

1714217142
return node;
1714317143
}
@@ -17787,7 +17787,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
1778717787
parser_lex(parser);
1778817788

1778917789
pm_node_t *node = (pm_node_t *) pm_redo_node_create(parser, &parser->previous);
17790-
parse_block_exit(parser, node, "redo");
17790+
if (!parser->parsing_eval) parse_block_exit(parser, node, "redo");
1779117791

1779217792
return node;
1779317793
}
@@ -19895,6 +19895,7 @@ pm_parser_init(pm_parser_t *parser, const uint8_t *source, size_t size, const pm
1989519895
.start_line = 1,
1989619896
.explicit_encoding = NULL,
1989719897
.command_line = 0,
19898+
.parsing_eval = false,
1989819899
.command_start = true,
1989919900
.recovering = false,
1990019901
.encoding_changed = false,
@@ -19955,6 +19956,8 @@ pm_parser_init(pm_parser_t *parser, const uint8_t *source, size_t size, const pm
1995519956
parser->version = options->version;
1995619957

1995719958
// scopes option
19959+
parser->parsing_eval = options->scopes_count > 0;
19960+
1995819961
for (size_t scope_index = 0; scope_index < options->scopes_count; scope_index++) {
1995919962
const pm_options_scope_t *scope = pm_options_scope_get(options, scope_index);
1996019963
pm_parser_scope_push(parser, scope_index == 0);

0 commit comments

Comments
 (0)