mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
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:
@@ -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 */
|
||||
|
||||
@@ -61,7 +61,6 @@ enum node_type {
|
||||
NODE_REGX,
|
||||
NODE_DREGX,
|
||||
NODE_CALLARGS,
|
||||
NODE_KW_REST_ARGS,
|
||||
NODE_SPLAT,
|
||||
NODE_TO_ARY,
|
||||
NODE_SVALUE,
|
||||
|
||||
@@ -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 */
|
||||
{
|
||||
|
||||
@@ -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 */
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user