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 <noreply@anthropic.com>
This commit is contained in:
Yukihiro "Matz" Matsumoto
2025-09-30 14:18:29 +09:00
parent 492ccefa25
commit 6c923dc12c
4 changed files with 17 additions and 41 deletions
+2 -2
View File
@@ -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);
}
+2 -7
View File
@@ -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 {
+3 -3
View File
@@ -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:
+10 -29
View File
@@ -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)) {