diff options
| author | Kevin Newton <kddnewton@gmail.com> | 2024-04-29 15:50:16 -0400 |
|---|---|---|
| committer | Kevin Newton <kddnewton@gmail.com> | 2024-05-01 12:34:29 -0400 |
| commit | 0fa09c5729fab6b5eb084a01d582587faf6405a3 (patch) | |
| tree | dd04415b8934ec1ffbbf9050141a221ea78cc121 | |
| parent | cfe7019ef517804e0b36c5beeb520191d7eb9b52 (diff) | |
[PRISM] Correct encoding for interpolated string literals in regexp
| -rw-r--r-- | prism_compile.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/prism_compile.c b/prism_compile.c index 915e80d65e..f883224f2d 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -369,11 +369,7 @@ parse_regexp_string_part(rb_iseq_t *iseq, const pm_scope_node_t *scope_node, con // check that it's okay here for this fragment of the string. VALUE string = rb_enc_str_new((const char *) pm_string_source(unescaped), pm_string_length(unescaped), regexp_encoding); VALUE error = rb_reg_check_preprocess(string); - - if (error != Qnil) { - parse_regexp_error(iseq, pm_node_line_number(scope_node->parser, node), "%" PRIsVALUE, rb_obj_as_string(error)); - } - + if (error != Qnil) parse_regexp_error(iseq, pm_node_line_number(scope_node->parser, node), "%" PRIsVALUE, rb_obj_as_string(error)); return string; } @@ -388,17 +384,28 @@ pm_static_literal_concat(rb_iseq_t *iseq, const pm_node_list_t *nodes, const pm_ switch (PM_NODE_TYPE(part)) { case PM_STRING_NODE: - if (regexp_encoding == NULL) { - string = parse_string_encoded(part, &((const pm_string_node_t *) part)->unescaped, scope_node->encoding); + if (regexp_encoding != NULL) { + if (top) { + string = parse_regexp_string_part(iseq, scope_node, part, &((const pm_string_node_t *) part)->unescaped, regexp_encoding); + } + else { + string = parse_string_encoded(part, &((const pm_string_node_t *) part)->unescaped, scope_node->encoding); + VALUE error = rb_reg_check_preprocess(string); + if (error != Qnil) parse_regexp_error(iseq, pm_node_line_number(scope_node->parser, part), "%" PRIsVALUE, rb_obj_as_string(error)); + } } else { - string = parse_regexp_string_part(iseq, scope_node, part, &((const pm_string_node_t *) part)->unescaped, regexp_encoding); + string = parse_string_encoded(part, &((const pm_string_node_t *) part)->unescaped, scope_node->encoding); } - break; case PM_INTERPOLATED_STRING_NODE: string = pm_static_literal_concat(iseq, &((const pm_interpolated_string_node_t *) part)->parts, scope_node, regexp_encoding, false); break; + case PM_EMBEDDED_STATEMENTS_NODE: { + const pm_embedded_statements_node_t *cast = (const pm_embedded_statements_node_t *) part; + string = pm_static_literal_concat(iseq, &cast->statements->body, scope_node, regexp_encoding, false); + break; + } default: RUBY_ASSERT(false && "unexpected node type in pm_static_literal_concat"); return Qnil; |
