summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Newton <kddnewton@gmail.com>2024-04-29 15:50:16 -0400
committerKevin Newton <kddnewton@gmail.com>2024-05-01 12:34:29 -0400
commit0fa09c5729fab6b5eb084a01d582587faf6405a3 (patch)
treedd04415b8934ec1ffbbf9050141a221ea78cc121
parentcfe7019ef517804e0b36c5beeb520191d7eb9b52 (diff)
[PRISM] Correct encoding for interpolated string literals in regexp
-rw-r--r--prism_compile.c25
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;