From b801a19c6a5270d32298de5486fdf96e0071b223 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Tue, 6 Feb 2024 09:44:46 -0500 Subject: [PATCH] [PRISM] Handle empty interpolated statements at start of string --- prism_compile.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/prism_compile.c b/prism_compile.c index 4ae0056a5d..bb1a4aa122 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -738,12 +738,14 @@ pm_interpolated_node_compile(pm_node_list_t *parts, rb_iseq_t *iseq, NODE dummy_ if (parts_size > 0) { VALUE current_string = Qnil; + for (size_t index = 0; index < parts_size; index++) { - pm_node_t *part = parts->nodes[index]; + const pm_node_t *part = parts->nodes[index]; if (PM_NODE_TYPE_P(part, PM_STRING_NODE)) { - pm_string_node_t *string_node = (pm_string_node_t *)part; + const pm_string_node_t *string_node = (const pm_string_node_t *)part; VALUE string_value = parse_string_encoded((pm_node_t *)string_node, &string_node->unescaped, parser); + if (RTEST(current_string)) { current_string = rb_str_concat(current_string, string_value); } @@ -752,10 +754,12 @@ pm_interpolated_node_compile(pm_node_list_t *parts, rb_iseq_t *iseq, NODE dummy_ } } else if (PM_NODE_TYPE_P(part, PM_EMBEDDED_STATEMENTS_NODE) && - ((pm_embedded_statements_node_t *)part)->statements->body.size == 1 && - PM_NODE_TYPE_P(((pm_embedded_statements_node_t *)part)->statements->body.nodes[0], PM_STRING_NODE)) { - pm_string_node_t *string_node = (pm_string_node_t *)((pm_embedded_statements_node_t *)part)->statements->body.nodes[0]; + ((const pm_embedded_statements_node_t *) part)->statements != NULL && + ((const pm_embedded_statements_node_t *) part)->statements->body.size == 1 && + PM_NODE_TYPE_P(((const pm_embedded_statements_node_t *) part)->statements->body.nodes[0], PM_STRING_NODE)) { + const pm_string_node_t *string_node = (const pm_string_node_t *) ((const pm_embedded_statements_node_t *) part)->statements->body.nodes[0]; VALUE string_value = parse_string_encoded((pm_node_t *)string_node, &string_node->unescaped, parser); + if (RTEST(current_string)) { current_string = rb_str_concat(current_string, string_value); }