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