зеркало из https://github.com/github/ruby.git
Embed `rb_args_info` in `rb_node_args_t`
This commit is contained in:
Родитель
fbd55120f3
Коммит
13c9cbe09e
2
ast.c
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
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;
|
||||
}
|
||||
}
|
||||
|
|
26
node_dump.c
26
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:
|
||||
|
|
21
parse.y
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;
|
||||
}
|
||||
|
|
44
rubyparser.h
44
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))<<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 {
|
||||
|
|
Загрузка…
Ссылка в новой задаче