mruby-compiler: simplify NODE_KW_ARG to direct cons structure

Replace NODE_KW_ARG wrapper with direct (key . value) cons structure,
eliminating unnecessary memory overhead and access indirection.

Changes:
- Remove NODE_KW_ARG node type from enum
- Modify new_kw_arg() to return direct cons instead of wrapped structure
- Update codegen.c to use simplified access patterns (k->car->car, k->car->cdr)
- Fix new_args_tail() to handle simplified keyword argument structure
- Remove NODE_KW_ARG case from parser dump function

This reduces memory usage from 3 cons cells to 1 per keyword argument
while maintaining full functionality and following mruby's design priority
of memory efficiency over complexity.

Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
Yukihiro "Matz" Matsumoto
2025-09-19 07:20:15 +09:00
parent 4f3abb8068
commit 3437c33cf8
4 changed files with 19 additions and 33 deletions
+3 -4
View File
@@ -2410,10 +2410,9 @@ lambda_body(codegen_scope *s, node *locals, struct mrb_ast_args *args, node *bod
while (kwds) {
int jmpif_key_p, jmp_def_set = -1;
node *kwd = kwds->car, *def_arg = kwd->cdr->cdr->car;
mrb_sym kwd_sym = node_to_sym(kwd->cdr->car);
mrb_assert(node_to_int(kwd->car) == NODE_KW_ARG);
node *kwd = kwds->car;
mrb_sym kwd_sym = node_to_sym(kwd->car); /* Direct access to key */
node *def_arg = kwd->cdr; /* Direct access to value */
if (def_arg) {
int idx;
-1
View File
@@ -61,7 +61,6 @@ enum node_type {
NODE_REGX,
NODE_DREGX,
NODE_CALLARGS,
NODE_KW_ARG,
NODE_KW_REST_ARGS,
NODE_SPLAT,
NODE_TO_ARY,
+8 -14
View File
@@ -1401,15 +1401,15 @@ new_args_tail(parser_state *p, node *kws, mrb_sym kwrest, mrb_sym blk)
/* allocate register for keywords arguments */
/* order is for Proc#parameters */
for (k = kws; k; k = k->cdr) {
if (!k->car->cdr->cdr->car) { /* allocate required keywords */
local_add_f(p, node_to_sym(k->car->cdr->car));
if (!k->car->cdr) { /* allocate required keywords - simplified structure: (key . NULL) */
local_add_f(p, node_to_sym(k->car->car));
}
}
for (k = kws; k; k = k->cdr) {
if (k->car->cdr->cdr->car) { /* allocate keywords with default */
local_add_lv(p, k->car->cdr->cdr->car->cdr);
k->car->cdr->cdr->car = k->car->cdr->cdr->car->car;
local_add_f(p, node_to_sym(k->car->cdr->car));
if (k->car->cdr) { /* allocate keywords with default - simplified structure: (key . value) */
local_add_lv(p, k->car->cdr->cdr); /* value->cdr for default args */
k->car->cdr = k->car->cdr->car; /* value->car for default args */
local_add_f(p, node_to_sym(k->car->car));
}
}
@@ -1417,12 +1417,12 @@ new_args_tail(parser_state *p, node *kws, mrb_sym kwrest, mrb_sym blk)
return cons(kws, cons(sym_to_node(kwrest), sym_to_node(blk)));
}
/* (:kw_arg kw_sym def_arg) */
/* (kw_sym . def_arg) - simplified from NODE_KW_ARG wrapper */
static node*
new_kw_arg(parser_state *p, mrb_sym kw, node *def_arg)
{
mrb_assert(kw);
return list3((node*)NODE_KW_ARG, sym_to_node(kw), def_arg);
return cons(sym_to_node(kw), def_arg);
}
/* (:kw_rest_args . a) */
@@ -8583,12 +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_ARG:
printf("NODE_KW_ARG %s:\n", mrb_sym_name(mrb, node_to_sym(tree->car)));
mrb_parser_dump(mrb, tree->cdr->car, 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)));
+8 -14
View File
@@ -1463,15 +1463,15 @@ new_args_tail(parser_state *p, node *kws, mrb_sym kwrest, mrb_sym blk)
/* allocate register for keywords arguments */
/* order is for Proc#parameters */
for (k = kws; k; k = k->cdr) {
if (!k->car->cdr->cdr->car) { /* allocate required keywords */
local_add_f(p, node_to_sym(k->car->cdr->car));
if (!k->car->cdr) { /* allocate required keywords - simplified structure: (key . NULL) */
local_add_f(p, node_to_sym(k->car->car));
}
}
for (k = kws; k; k = k->cdr) {
if (k->car->cdr->cdr->car) { /* allocate keywords with default */
local_add_lv(p, k->car->cdr->cdr->car->cdr);
k->car->cdr->cdr->car = k->car->cdr->cdr->car->car;
local_add_f(p, node_to_sym(k->car->cdr->car));
if (k->car->cdr) { /* allocate keywords with default - simplified structure: (key . value) */
local_add_lv(p, k->car->cdr->cdr); /* value->cdr for default args */
k->car->cdr = k->car->cdr->car; /* value->car for default args */
local_add_f(p, node_to_sym(k->car->car));
}
}
@@ -1479,12 +1479,12 @@ new_args_tail(parser_state *p, node *kws, mrb_sym kwrest, mrb_sym blk)
return cons(kws, cons(sym_to_node(kwrest), sym_to_node(blk)));
}
/* (:kw_arg kw_sym def_arg) */
/* (kw_sym . def_arg) - simplified from NODE_KW_ARG wrapper */
static node*
new_kw_arg(parser_state *p, mrb_sym kw, node *def_arg)
{
mrb_assert(kw);
return list3((node*)NODE_KW_ARG, sym_to_node(kw), def_arg);
return cons(sym_to_node(kw), def_arg);
}
/* (:kw_rest_args . a) */
@@ -15412,12 +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_ARG:
printf("NODE_KW_ARG %s:\n", mrb_sym_name(mrb, node_to_sym(tree->car)));
mrb_parser_dump(mrb, tree->cdr->car, 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)));