From 4a04f7d4eb49677df18bc299a7d862525789e299 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Sat, 20 Sep 2025 06:29:37 +0900 Subject: [PATCH] mruby-compiler: eliminate NODE_KW_REST_ARGS and use direct symbol markers Replace NODE_KW_REST_ARGS wrapper nodes with direct ** symbol markers to reduce memory overhead and simplify code structure. This continues the compiler simplification work by unifying keyword rest arguments with other node types while maintaining full functionality. Co-authored-by: Claude --- mrbgems/mruby-compiler/core/codegen.c | 4 ++-- mrbgems/mruby-compiler/core/node.h | 1 - mrbgems/mruby-compiler/core/parse.y | 9 +-------- mrbgems/mruby-compiler/core/y.tab.c | 9 +-------- 4 files changed, 4 insertions(+), 19 deletions(-) diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index afe5d9898..b15529770 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -2672,7 +2672,7 @@ gen_hash(codegen_scope *s, node *tree, int val, int limit) mrb_bool first = TRUE; while (tree) { - if (node_to_int(tree->car->car->car) == NODE_KW_REST_ARGS) { + if (node_to_sym(tree->car->car) == MRB_OPSYM_2(s->mrb, pow)) { if (val && first) { genop_2(s, OP_HASH, cursp(), 0); push(); @@ -3208,7 +3208,7 @@ gen_hash_var(codegen_scope *s, node *varnode, int val) struct mrb_ast_node *value = pairs[i * 2 + 1]; /* Check if this is a double-splat (**kwargs) */ - if (node_to_int(key->car) == NODE_KW_REST_ARGS) { + if (node_to_sym(key) == MRB_OPSYM_2(s->mrb, pow)) { /* Flush any accumulated regular pairs first */ if (val && first && regular_pairs == 0) { /* First element is splat - create empty hash */ diff --git a/mrbgems/mruby-compiler/core/node.h b/mrbgems/mruby-compiler/core/node.h index 7c2ff3ea6..fb42c6ece 100644 --- a/mrbgems/mruby-compiler/core/node.h +++ b/mrbgems/mruby-compiler/core/node.h @@ -61,7 +61,6 @@ enum node_type { NODE_REGX, NODE_DREGX, NODE_CALLARGS, - NODE_KW_REST_ARGS, NODE_SPLAT, NODE_TO_ARY, NODE_SVALUE, diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y index f7ae7afd9..91fdbf8f3 100644 --- a/mrbgems/mruby-compiler/core/parse.y +++ b/mrbgems/mruby-compiler/core/parse.y @@ -1429,7 +1429,7 @@ new_kw_arg(parser_state *p, mrb_sym kw, node *def_arg) static node* new_kw_rest_args(parser_state *p, mrb_sym sym) { - return cons_head((node*)NODE_KW_REST_ARGS, sym_to_node(sym)); + return sym_to_node(intern_op(pow)); /* Use ** symbol as direct marker */ } static node* @@ -8583,13 +8583,6 @@ mrb_parser_dump(mrb_state *mrb, node *tree, int offset) dump_recur(mrb, ((parser_heredoc_info*)tree)->doc, offset+1); break; - case NODE_KW_REST_ARGS: - if (tree) - printf("NODE_KW_REST_ARGS %s\n", mrb_sym_name(mrb, node_to_sym(tree))); - else - printf("NODE_KW_REST_ARGS\n"); - break; - case NODE_VARIABLE: /* Handle variable-sized nodes wrapped in NODE_VARIABLE */ { diff --git a/mrbgems/mruby-compiler/core/y.tab.c b/mrbgems/mruby-compiler/core/y.tab.c index 52bafbc5e..6485de98d 100644 --- a/mrbgems/mruby-compiler/core/y.tab.c +++ b/mrbgems/mruby-compiler/core/y.tab.c @@ -1491,7 +1491,7 @@ new_kw_arg(parser_state *p, mrb_sym kw, node *def_arg) static node* new_kw_rest_args(parser_state *p, mrb_sym sym) { - return cons_head((node*)NODE_KW_REST_ARGS, sym_to_node(sym)); + return sym_to_node(intern_op(pow)); /* Use ** symbol as direct marker */ } static node* @@ -15412,13 +15412,6 @@ mrb_parser_dump(mrb_state *mrb, node *tree, int offset) dump_recur(mrb, ((parser_heredoc_info*)tree)->doc, offset+1); break; - case NODE_KW_REST_ARGS: - if (tree) - printf("NODE_KW_REST_ARGS %s\n", mrb_sym_name(mrb, node_to_sym(tree))); - else - printf("NODE_KW_REST_ARGS\n"); - break; - case NODE_VARIABLE: /* Handle variable-sized nodes wrapped in NODE_VARIABLE */ {