Embed `rb_args_info` in `rb_node_args_t`

This commit is contained in:
Nobuyoshi Nakada 2023-10-30 00:19:43 +09:00
Родитель fbd55120f3
Коммит 13c9cbe09e
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 3582D74E1FEE4465
6 изменённых файлов: 49 добавлений и 51 удалений

2
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),

Просмотреть файл

@ -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;

3
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;
}
}

Просмотреть файл

@ -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:

21
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;
}

Просмотреть файл

@ -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))<<NODE_TYPESHIFT)&NODE_TYPEMASK))
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 node_buffer_struct node_buffer_t;
/* T_IMEMO/ast */
typedef struct rb_ast_body_struct {