From af4df6d75dc16212ed91f66f37d56ce39f840a20 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Fri, 26 Sep 2025 08:39:57 +0900 Subject: [PATCH] mruby-compiler: fix NODE_HEREDOC parser dump crash Replace dump_recur() with dump_str() in NODE_HEREDOC case to properly handle cons-lists of string representations instead of AST nodes. This fixes segmentation faults when dumping heredoc AST nodes. Co-authored-by: Claude --- mrbgems/mruby-compiler/core/parse.y | 20 ++++++++++++++++++-- mrbgems/mruby-compiler/core/y.tab.c | 20 ++++++++++++++++++-- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y index dddec22ea..489d28bd5 100644 --- a/mrbgems/mruby-compiler/core/parse.y +++ b/mrbgems/mruby-compiler/core/parse.y @@ -8343,8 +8343,24 @@ dump_node(mrb_state *mrb, node *tree, int offset) break; case NODE_HEREDOC: - printf("NODE_HEREDOC (<<%s):\n", ((parser_heredoc_info*)tree)->term); - dump_recur(mrb, ((parser_heredoc_info*)tree)->doc, offset+1); + printf("NODE_HEREDOC:\n"); + if (heredoc_node(tree)->info.term) { + dump_prefix(offset+1, lineno); + printf("terminator: \"%s\"\n", heredoc_node(tree)->info.term); + } + if (heredoc_node(tree)->info.doc) { + dump_prefix(offset+1, lineno); + printf("body:\n"); + dump_str(mrb, heredoc_node(tree)->info.doc, offset+2, lineno); + } + if (heredoc_node(tree)->info.allow_indent) { + dump_prefix(offset+1, lineno); + printf("allow_indent: true\n"); + } + if (heredoc_node(tree)->info.remove_indent) { + dump_prefix(offset+1, lineno); + printf("remove_indent: true\n"); + } break; default: diff --git a/mrbgems/mruby-compiler/core/y.tab.c b/mrbgems/mruby-compiler/core/y.tab.c index b622781f2..80ec209ac 100644 --- a/mrbgems/mruby-compiler/core/y.tab.c +++ b/mrbgems/mruby-compiler/core/y.tab.c @@ -15172,8 +15172,24 @@ dump_node(mrb_state *mrb, node *tree, int offset) break; case NODE_HEREDOC: - printf("NODE_HEREDOC (<<%s):\n", ((parser_heredoc_info*)tree)->term); - dump_recur(mrb, ((parser_heredoc_info*)tree)->doc, offset+1); + printf("NODE_HEREDOC:\n"); + if (heredoc_node(tree)->info.term) { + dump_prefix(offset+1, lineno); + printf("terminator: \"%s\"\n", heredoc_node(tree)->info.term); + } + if (heredoc_node(tree)->info.doc) { + dump_prefix(offset+1, lineno); + printf("body:\n"); + dump_str(mrb, heredoc_node(tree)->info.doc, offset+2, lineno); + } + if (heredoc_node(tree)->info.allow_indent) { + dump_prefix(offset+1, lineno); + printf("allow_indent: true\n"); + } + if (heredoc_node(tree)->info.remove_indent) { + dump_prefix(offset+1, lineno); + printf("remove_indent: true\n"); + } break; default: