[PRISM] Assume an eval context for RubyVM::ISEQ compile

Fixes [Bug #20741]
This commit is contained in:
Kevin Newton 2024-09-16 11:03:38 -04:00
parent 6c4ce72609
commit 2beb4c6e87
Notes: git 2024-09-16 18:31:18 +00:00
2 changed files with 10 additions and 1 deletions

1
iseq.c
View File

@ -1280,6 +1280,7 @@ pm_iseq_compile_with_option(VALUE src, VALUE file, VALUE realpath, VALUE line, V
pm_parse_result_t result = { 0 }; pm_parse_result_t result = { 0 };
pm_options_line_set(&result.options, NUM2INT(line)); pm_options_line_set(&result.options, NUM2INT(line));
pm_options_scopes_init(&result.options, 1);
result.node.coverage_enabled = 1; result.node.coverage_enabled = 1;
switch (option.frozen_string_literal) { switch (option.frozen_string_literal) {

View File

@ -6705,6 +6705,14 @@ pm_compile_scope_node(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_nod
} }
switch (body->type) { switch (body->type) {
case ISEQ_TYPE_PLAIN: {
RUBY_ASSERT(PM_NODE_TYPE_P(scope_node->ast_node, PM_INTERPOLATED_REGULAR_EXPRESSION_NODE));
const pm_interpolated_regular_expression_node_t *cast = (const pm_interpolated_regular_expression_node_t *) scope_node->ast_node;
pm_compile_regexp_dynamic(iseq, (const pm_node_t *) cast, &cast->parts, &location, ret, popped, scope_node);
break;
}
case ISEQ_TYPE_BLOCK: { case ISEQ_TYPE_BLOCK: {
LABEL *start = ISEQ_COMPILE_DATA(iseq)->start_label = NEW_LABEL(0); LABEL *start = ISEQ_COMPILE_DATA(iseq)->start_label = NEW_LABEL(0);
LABEL *end = ISEQ_COMPILE_DATA(iseq)->end_label = NEW_LABEL(0); LABEL *end = ISEQ_COMPILE_DATA(iseq)->end_label = NEW_LABEL(0);
@ -8474,7 +8482,7 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret,
pm_scope_node_t next_scope_node; pm_scope_node_t next_scope_node;
pm_scope_node_init(node, &next_scope_node, scope_node); pm_scope_node_init(node, &next_scope_node, scope_node);
block_iseq = NEW_CHILD_ISEQ(&next_scope_node, make_name_for_block(iseq), ISEQ_TYPE_BLOCK, location.line); block_iseq = NEW_CHILD_ISEQ(&next_scope_node, make_name_for_block(iseq), ISEQ_TYPE_PLAIN, location.line);
pm_scope_node_destroy(&next_scope_node); pm_scope_node_destroy(&next_scope_node);
ISEQ_COMPILE_DATA(iseq)->current_block = block_iseq; ISEQ_COMPILE_DATA(iseq)->current_block = block_iseq;