diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index afa2d1d74..afe5d9898 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -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; diff --git a/mrbgems/mruby-compiler/core/node.h b/mrbgems/mruby-compiler/core/node.h index 2f9f43a3f..7c2ff3ea6 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_ARG, NODE_KW_REST_ARGS, NODE_SPLAT, NODE_TO_ARY, diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y index 49bae19f9..f7ae7afd9 100644 --- a/mrbgems/mruby-compiler/core/parse.y +++ b/mrbgems/mruby-compiler/core/parse.y @@ -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))); diff --git a/mrbgems/mruby-compiler/core/y.tab.c b/mrbgems/mruby-compiler/core/y.tab.c index 5cd54c507..52bafbc5e 100644 --- a/mrbgems/mruby-compiler/core/y.tab.c +++ b/mrbgems/mruby-compiler/core/y.tab.c @@ -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)));