summaryrefslogtreecommitdiff
path: root/prism_compile.c
diff options
context:
space:
mode:
authorKevin Newton <kddnewton@gmail.com>2024-02-06 09:44:46 -0500
committerKevin Newton <kddnewton@gmail.com>2024-02-06 10:13:11 -0500
commitb801a19c6a5270d32298de5486fdf96e0071b223 (patch)
tree24785e2e99ba1e2a2f43a03309cb809ab34762fb /prism_compile.c
parentd6b7eae58e71f69b70a4782c9fc204d8379c1ea5 (diff)
[PRISM] Handle empty interpolated statements at start of string
Diffstat (limited to 'prism_compile.c')
-rw-r--r--prism_compile.c14
1 files 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);
}