From 6c923dc12c8da3d6ca69b49b560c3e3886c31210 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 30 Sep 2025 14:18:29 +0900 Subject: [PATCH] mruby-compiler: eliminate NODE_STR wrapper in NODE_DSYM implementation Refactored NODE_DSYM to use unified structure directly instead of wrapping NODE_STR. This eliminates unnecessary allocation and simplifies the AST. Changes: - new_dsym() now creates NODE_DSYM directly with mrb_ast_str_node structure - Parser calls new_dsym(p, n) instead of new_dsym(p, new_str(p, n)) - codegen_dsym() uses gen_string() for proper string generation - NODE_DSYM dump uses dump_str() for consistent string list handling - Removed redundant mrb_ast_dsym_node struct definition This maintains identical functionality while reducing memory overhead and architectural complexity, with proper string handling to prevent mrbtest crashes. Co-authored-by: Claude --- mrbgems/mruby-compiler/core/codegen.c | 4 +-- mrbgems/mruby-compiler/core/node.h | 9 ++----- mrbgems/mruby-compiler/core/parse.y | 6 ++--- mrbgems/mruby-compiler/core/y.tab.c | 39 +++++++-------------------- 4 files changed, 17 insertions(+), 41 deletions(-) diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index 952b3e45d..b5e721078 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -5125,9 +5125,9 @@ codegen_heredoc(codegen_scope *s, node *varnode, int val) static void codegen_dsym(codegen_scope *s, node *varnode, int val) { - struct mrb_ast_dsym_node *n = dsym_node(varnode); + struct mrb_ast_str_node *n = dsym_node(varnode); // Generate the list content, then intern to symbol - codegen(s, n->list, val); + gen_string(s, n->list, val); if (val) { gen_intern(s); } diff --git a/mrbgems/mruby-compiler/core/node.h b/mrbgems/mruby-compiler/core/node.h index d96705884..a7e28143a 100644 --- a/mrbgems/mruby-compiler/core/node.h +++ b/mrbgems/mruby-compiler/core/node.h @@ -639,22 +639,17 @@ struct mrb_ast_heredoc_node { struct mrb_parser_heredoc_info info; }; -struct mrb_ast_dsym_node { - struct mrb_ast_var_header header; - struct mrb_ast_node *list; -}; - #define xstr_node(n) ((struct mrb_ast_xstr_node*)(n)) #define regx_node(n) ((struct mrb_ast_regx_node*)(n)) #define heredoc_node(n) ((struct mrb_ast_heredoc_node*)(n)) -#define dsym_node(n) ((struct mrb_ast_dsym_node*)(n)) +#define dsym_node(n) ((struct mrb_ast_str_node*)(n)) #define XSTR_NODE_LIST(n) (xstr_node(n)->list) #define REGX_NODE_LIST(n) (regx_node(n)->list) #define REGX_NODE_FLAGS(n) (regx_node(n)->flags) #define REGX_NODE_ENCODING(n) (regx_node(n)->encoding) #define HEREDOC_NODE_NAME(n) (heredoc_node(n)->name) -#define DSYM_NODE_LIST(n) (dsym_node(n)->list) +#define DSYM_NODE_LIST(n) (str_node(n)->list) // Group 10: References and Variables struct mrb_ast_nth_ref_node { diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y index 6066a222c..1608180b7 100644 --- a/mrbgems/mruby-compiler/core/parse.y +++ b/mrbgems/mruby-compiler/core/parse.y @@ -1505,7 +1505,7 @@ new_xstr(parser_state *p, node *a) static node* new_dsym(parser_state *p, node *a) { - struct mrb_ast_dsym_node *n = (struct mrb_ast_dsym_node*)parser_palloc(p, sizeof(struct mrb_ast_dsym_node)); + struct mrb_ast_str_node *n = (struct mrb_ast_str_node*)parser_palloc(p, sizeof(struct mrb_ast_str_node)); init_var_header(&n->header, p, NODE_DSYM); n->list = a; return (node*)n; @@ -3981,7 +3981,7 @@ symbol : basic_symbol else { cons_free($4); } - $$ = new_dsym(p, new_str(p, n)); + $$ = new_dsym(p, n); } | tSYMBEG tNUMPARAM { @@ -7772,7 +7772,7 @@ dump_node(mrb_state *mrb, node *tree, int offset) case NODE_DSYM: printf("NODE_DSYM:\n"); - dump_node(mrb, dsym_node(tree)->list, offset+1); + dump_str(mrb, DSYM_NODE_LIST(tree), offset+1, lineno); break; case NODE_LVAR: diff --git a/mrbgems/mruby-compiler/core/y.tab.c b/mrbgems/mruby-compiler/core/y.tab.c index 20aea4596..10a51953e 100644 --- a/mrbgems/mruby-compiler/core/y.tab.c +++ b/mrbgems/mruby-compiler/core/y.tab.c @@ -1567,7 +1567,7 @@ new_xstr(parser_state *p, node *a) static node* new_dsym(parser_state *p, node *a) { - struct mrb_ast_dsym_node *n = (struct mrb_ast_dsym_node*)parser_palloc(p, sizeof(struct mrb_ast_dsym_node)); + struct mrb_ast_str_node *n = (struct mrb_ast_str_node*)parser_palloc(p, sizeof(struct mrb_ast_str_node)); init_var_header(&n->header, p, NODE_DSYM); n->list = a; return (node*)n; @@ -10283,7 +10283,7 @@ yyreduce: else { cons_free((yyvsp[0].nd)); } - (yyval.nd) = new_dsym(p, new_str(p, n)); + (yyval.nd) = new_dsym(p, n); } #line 10289 "mrbgems/mruby-compiler/core/y.tab.c" break; @@ -14601,7 +14601,7 @@ dump_node(mrb_state *mrb, node *tree, int offset) case NODE_DSYM: printf("NODE_DSYM:\n"); - dump_node(mrb, dsym_node(tree)->list, offset+1); + dump_str(mrb, DSYM_NODE_LIST(tree), offset+1, lineno); break; case NODE_LVAR: @@ -14905,26 +14905,17 @@ dump_node(mrb_state *mrb, node *tree, int offset) case NODE_WHILE: printf("NODE_WHILE:\n"); - dump_prefix(offset+1, lineno); - printf("cond:\n"); - dump_node(mrb, WHILE_NODE_CONDITION(tree), offset+2); - dump_prefix(offset+1, lineno); - printf("body:\n"); - dump_node(mrb, WHILE_NODE_BODY(tree), offset+2); - break; - + goto dump_loop_node; case NODE_UNTIL: printf("NODE_UNTIL:\n"); - dump_prefix(offset+1, lineno); - printf("cond:\n"); - dump_node(mrb, UNTIL_NODE_CONDITION(tree), offset+2); - dump_prefix(offset+1, lineno); - printf("body:\n"); - dump_node(mrb, UNTIL_NODE_BODY(tree), offset+2); - break; - + goto dump_loop_node; case NODE_WHILE_MOD: printf("NODE_WHILE_MOD:\n"); + goto dump_loop_node; + case NODE_UNTIL_MOD: + printf("NODE_UNTIL_MOD:\n"); + + dump_loop_node: dump_prefix(offset+1, lineno); printf("cond:\n"); dump_node(mrb, WHILE_NODE_CONDITION(tree), offset+2); @@ -14933,16 +14924,6 @@ dump_node(mrb_state *mrb, node *tree, int offset) dump_node(mrb, WHILE_NODE_BODY(tree), offset+2); break; - case NODE_UNTIL_MOD: - printf("NODE_UNTIL_MOD:\n"); - dump_prefix(offset+1, lineno); - printf("cond:\n"); - dump_node(mrb, UNTIL_NODE_CONDITION(tree), offset+2); - dump_prefix(offset+1, lineno); - printf("body:\n"); - dump_node(mrb, UNTIL_NODE_BODY(tree), offset+2); - break; - case NODE_FOR: printf("NODE_FOR:\n"); if (FOR_NODE_VAR(tree)) {