mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
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:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
Reference in New Issue
Block a user