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 <noreply@anthropic.com>
This commit is contained in:
Yukihiro "Matz" Matsumoto
2025-09-20 06:29:37 +09:00
parent 3437c33cf8
commit 4a04f7d4eb
4 changed files with 4 additions and 19 deletions
+2 -2
View File
@@ -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 */
-1
View File
@@ -61,7 +61,6 @@ enum node_type {
NODE_REGX,
NODE_DREGX,
NODE_CALLARGS,
NODE_KW_REST_ARGS,
NODE_SPLAT,
NODE_TO_ARY,
NODE_SVALUE,
+1 -8
View File
@@ -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 */
{
+1 -8
View File
@@ -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 */
{