From 13c9cbe09ef310c7ddf055d57ebf4586e9f9a111 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Mon, 30 Oct 2023 00:19:43 +0900 Subject: [PATCH] Embed `rb_args_info` in `rb_node_args_t` --- ast.c | 2 +- compile.c | 4 ++-- node.c | 3 +-- node_dump.c | 26 +++++++++++++------------- parse.y | 21 ++++++++++----------- rubyparser.h | 44 ++++++++++++++++++++++---------------------- 6 files changed, 49 insertions(+), 51 deletions(-) diff --git a/ast.c b/ast.c index c71b7b3987..6d2ca17ca7 100644 --- a/ast.c +++ b/ast.c @@ -639,7 +639,7 @@ node_children(rb_ast_t *ast, const NODE *node) NEW_CHILD(ast, RNODE_POSTARG(node)->nd_2nd)); case NODE_ARGS: { - struct rb_args_info *ainfo = RNODE_ARGS(node)->nd_ainfo; + struct rb_args_info *ainfo = &RNODE_ARGS(node)->nd_ainfo; return rb_ary_new_from_args(10, INT2NUM(ainfo->pre_args_num), NEW_CHILD(ast, ainfo->pre_init), diff --git a/compile.c b/compile.c index df258da772..1c3bdde9a2 100644 --- a/compile.c +++ b/compile.c @@ -1995,7 +1995,7 @@ iseq_set_arguments(rb_iseq_t *iseq, LINK_ANCHOR *const optargs, const NODE *cons if (node_args) { struct rb_iseq_constant_body *const body = ISEQ_BODY(iseq); - struct rb_args_info *args = RNODE_ARGS(node_args)->nd_ainfo; + struct rb_args_info *args = &RNODE_ARGS(node_args)->nd_ainfo; ID rest_id = 0; int last_comma = 0; ID block_id = 0; @@ -8377,7 +8377,7 @@ compile_builtin_mandatory_only_method(rb_iseq_t *iseq, const NODE *node, const N }; rb_node_args_t args_node; rb_node_init(RNODE(&args_node), NODE_ARGS); - args_node.nd_ainfo = &args; + args_node.nd_ainfo = args; // local table without non-mandatory parameters const int skip_local_size = ISEQ_BODY(iseq)->param.size - ISEQ_BODY(iseq)->param.lead_num; diff --git a/node.c b/node.c index f76e10e69b..1f10258343 100644 --- a/node.c +++ b/node.c @@ -173,8 +173,7 @@ static void free_ast_value(rb_ast_t *ast, void *ctx, NODE *node) { switch (nd_type(node)) { - case NODE_ARGS: - xfree(RNODE_ARGS(node)->nd_ainfo); + default: break; } } diff --git a/node_dump.c b/node_dump.c index 2262d0b4a0..391aea10b1 100644 --- a/node_dump.c +++ b/node_dump.c @@ -1007,26 +1007,26 @@ dump_node(VALUE buf, VALUE indent, int comment, const NODE * node) case NODE_ARGS: ANN("method parameters"); - ANN("format: def method_name(.., [nd_ainfo->nd_optargs], *[nd_ainfo->rest_arg], [nd_ainfo->first_post_arg], .., [nd_ainfo->kw_args], **[nd_ainfo->kw_rest_arg], &[nd_ainfo->block_arg])"); + ANN("format: def method_name(.., [nd_ainfo.nd_optargs], *[nd_ainfo.rest_arg], [nd_ainfo.first_post_arg], .., [nd_ainfo.kw_args], **[nd_ainfo.kw_rest_arg], &[nd_ainfo.block_arg])"); ANN("example: def foo(a, b, opt1=1, opt2=2, *rest, y, z, kw: 1, **kwrest, &blk); end"); - F_INT(nd_ainfo->pre_args_num, RNODE_ARGS, "count of mandatory (pre-)arguments"); - F_NODE(nd_ainfo->pre_init, RNODE_ARGS, "initialization of (pre-)arguments"); - F_INT(nd_ainfo->post_args_num, RNODE_ARGS, "count of mandatory post-arguments"); - F_NODE(nd_ainfo->post_init, RNODE_ARGS, "initialization of post-arguments"); - F_ID(nd_ainfo->first_post_arg, RNODE_ARGS, "first post argument"); - F_CUSTOM1(nd_ainfo->rest_arg, "rest argument") { - if (RNODE_ARGS(node)->nd_ainfo->rest_arg == NODE_SPECIAL_EXCESSIVE_COMMA) { + F_INT(nd_ainfo.pre_args_num, RNODE_ARGS, "count of mandatory (pre-)arguments"); + F_NODE(nd_ainfo.pre_init, RNODE_ARGS, "initialization of (pre-)arguments"); + F_INT(nd_ainfo.post_args_num, RNODE_ARGS, "count of mandatory post-arguments"); + F_NODE(nd_ainfo.post_init, RNODE_ARGS, "initialization of post-arguments"); + F_ID(nd_ainfo.first_post_arg, RNODE_ARGS, "first post argument"); + F_CUSTOM1(nd_ainfo.rest_arg, "rest argument") { + if (RNODE_ARGS(node)->nd_ainfo.rest_arg == NODE_SPECIAL_EXCESSIVE_COMMA) { A("1 (excessed comma)"); } else { - A_ID(RNODE_ARGS(node)->nd_ainfo->rest_arg); + A_ID(RNODE_ARGS(node)->nd_ainfo.rest_arg); } } - F_ID(nd_ainfo->block_arg, RNODE_ARGS, "block argument"); - F_NODE(nd_ainfo->opt_args, RNODE_ARGS, "optional arguments"); - F_NODE(nd_ainfo->kw_args, RNODE_ARGS, "keyword arguments"); + F_ID(nd_ainfo.block_arg, RNODE_ARGS, "block argument"); + F_NODE(nd_ainfo.opt_args, RNODE_ARGS, "optional arguments"); + F_NODE(nd_ainfo.kw_args, RNODE_ARGS, "keyword arguments"); LAST_NODE; - F_NODE(nd_ainfo->kw_rest_arg, RNODE_ARGS, "keyword rest argument"); + F_NODE(nd_ainfo.kw_rest_arg, RNODE_ARGS, "keyword rest argument"); return; case NODE_SCOPE: diff --git a/parse.y b/parse.y index eb2a2b3984..1eaaf9442f 100644 --- a/parse.y +++ b/parse.y @@ -911,7 +911,7 @@ static rb_node_xstr_t *rb_node_xstr_new(struct parser_params *p, VALUE nd_lit, c static rb_node_dxstr_t *rb_node_dxstr_new(struct parser_params *p, VALUE nd_lit, long nd_alen, NODE *nd_next, const YYLTYPE *loc); static rb_node_evstr_t *rb_node_evstr_new(struct parser_params *p, NODE *nd_body, const YYLTYPE *loc); static rb_node_once_t *rb_node_once_new(struct parser_params *p, NODE *nd_body, const YYLTYPE *loc); -static rb_node_args_t *rb_node_args_new(struct parser_params *p, struct rb_args_info *nd_ainfo, const YYLTYPE *loc); +static rb_node_args_t *rb_node_args_new(struct parser_params *p, const YYLTYPE *loc); static rb_node_args_aux_t *rb_node_args_aux_new(struct parser_params *p, ID nd_pid, long nd_plen, const YYLTYPE *loc); static rb_node_opt_arg_t *rb_node_opt_arg_new(struct parser_params *p, NODE *nd_body, const YYLTYPE *loc); static rb_node_kw_arg_t *rb_node_kw_arg_new(struct parser_params *p, NODE *nd_body, const YYLTYPE *loc); @@ -1012,7 +1012,7 @@ static rb_node_error_t *rb_node_error_new(struct parser_params *p, const YYLTYPE #define NEW_DXSTR(s,l,n,loc) (NODE *)rb_node_dxstr_new(p,s,l,n,loc) #define NEW_EVSTR(n,loc) (NODE *)rb_node_evstr_new(p,n,loc) #define NEW_ONCE(b,loc) (NODE *)rb_node_once_new(p,b,loc) -#define NEW_ARGS(a,loc) rb_node_args_new(p,a,loc) +#define NEW_ARGS(loc) rb_node_args_new(p,loc) #define NEW_ARGS_AUX(r,b,loc) rb_node_args_aux_new(p,r,b,loc) #define NEW_OPT_ARG(v,loc) rb_node_opt_arg_new(p,v,loc) #define NEW_KW_ARG(v,loc) rb_node_kw_arg_new(p,v,loc) @@ -4784,7 +4784,7 @@ f_larglist : '(' f_args opt_bv_decl ')' { p->ctxt.in_argdef = 0; /*%%%*/ - if (!args_info_empty_p($1->nd_ainfo)) + if (!args_info_empty_p(&$1->nd_ainfo)) p->max_numparam = ORDINAL_PARAM; /*% %*/ $$ = $1; @@ -6148,7 +6148,7 @@ args_tail : f_kwarg ',' f_kwrest opt_f_block_arg add_forwarding_args(p); $$ = new_args_tail(p, Qnone, $1, arg_FWD_BLOCK, &@1); /*%%%*/ - $$->nd_ainfo->forwarding = 1; + $$->nd_ainfo.forwarding = 1; /*% %*/ } ; @@ -11945,10 +11945,10 @@ rb_node_once_new(struct parser_params *p, NODE *nd_body, const YYLTYPE *loc) } static rb_node_args_t * -rb_node_args_new(struct parser_params *p, struct rb_args_info *nd_ainfo, const YYLTYPE *loc) +rb_node_args_new(struct parser_params *p, const YYLTYPE *loc) { rb_node_args_t *n = NODE_NEWNODE(NODE_ARGS, rb_node_args_t, loc); - n->nd_ainfo = nd_ainfo; + MEMZERO(&n->nd_ainfo, struct rb_args_info, 1); return n; } @@ -14317,7 +14317,7 @@ args_info_empty_p(struct rb_args_info *args) static rb_node_args_t * new_args(struct parser_params *p, rb_node_args_aux_t *pre_args, rb_node_opt_arg_t *opt_args, ID rest_arg, rb_node_args_aux_t *post_args, rb_node_args_t *tail, const YYLTYPE *loc) { - struct rb_args_info *args = tail->nd_ainfo; + struct rb_args_info *args = &tail->nd_ainfo; if (args->forwarding) { if (rest_arg) { @@ -14352,9 +14352,8 @@ new_args(struct parser_params *p, rb_node_args_aux_t *pre_args, rb_node_opt_arg_ static rb_node_args_t * new_args_tail(struct parser_params *p, rb_node_kw_arg_t *kw_args, ID kw_rest_arg, ID block, const YYLTYPE *kw_rest_loc) { - rb_node_args_t *node = NEW_ARGS(0, &NULL_LOC); - struct rb_args_info *args = ZALLOC(struct rb_args_info); - node->nd_ainfo = args; + rb_node_args_t *node = NEW_ARGS(&NULL_LOC); + struct rb_args_info *args = &node->nd_ainfo; if (p->error_p) return node; args->block_arg = block; @@ -14416,7 +14415,7 @@ args_with_numbered(struct parser_params *p, rb_node_args_t *args, int max_numpar args = new_args_tail(p, 0, 0, 0, 0); nd_set_loc(RNODE(args), &loc); } - args->nd_ainfo->pre_args_num = max_numparam; + args->nd_ainfo.pre_args_num = max_numparam; } return args; } diff --git a/rubyparser.h b/rubyparser.h index bee6769396..d366227318 100644 --- a/rubyparser.h +++ b/rubyparser.h @@ -667,10 +667,31 @@ typedef struct RNode_ONCE { struct RNode *nd_body; } rb_node_once_t; +struct rb_args_info { + NODE *pre_init; + NODE *post_init; + + int pre_args_num; /* count of mandatory pre-arguments */ + int post_args_num; /* count of mandatory post-arguments */ + + ID first_post_arg; + + ID rest_arg; + ID block_arg; + + struct RNode_KW_ARG *kw_args; + NODE *kw_rest_arg; + + struct RNode_OPT_ARG *opt_args; + unsigned int no_kwarg: 1; + unsigned int ruby2_keywords: 1; + unsigned int forwarding: 1; +}; + typedef struct RNode_ARGS { NODE node; - struct rb_args_info *nd_ainfo; + struct rb_args_info nd_ainfo; } rb_node_args_t; typedef struct RNode_ARGS_AUX { @@ -1061,27 +1082,6 @@ typedef struct RNode_RIPPER_VALUES { #define nd_init_type(n,t) \ (n)->flags=(((n)->flags&~NODE_TYPEMASK)|((((unsigned long)(t))<