Avoid usage of the magic number (NODE*)-1

This magic number has two meanings depending upon the context:

* "required keyword argument (no name)" on NODE_LASGN (`def foo(x:)`)
* "rest argument (no name)" on NODE_MASGN and NODE_POSTARG
  ('a, b, * = ary` or `a, b, *, z = ary`)

To show this intention explicitly, two macros are introduced:
NODE_SPECIAL_REQUIRED_KEYWORD and NODE_SPECIAL_NO_NAME_REST.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60650 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
mame 2017-11-04 14:24:16 +00:00
parent 6d022ae147
commit af9b0da125
4 changed files with 23 additions and 20 deletions

View File

@ -3708,7 +3708,7 @@ compile_massign(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node,
const NODE *rhsn = node->nd_value; const NODE *rhsn = node->nd_value;
const NODE *splatn = node->nd_args; const NODE *splatn = node->nd_args;
const NODE *lhsn = node->nd_head; const NODE *lhsn = node->nd_head;
int lhs_splat = (splatn && (VALUE)splatn != (VALUE)-1) ? 1 : 0; int lhs_splat = (splatn && splatn != NODE_SPECIAL_NO_NAME_REST) ? 1 : 0;
if (!popped || splatn || !compile_massign_opt(iseq, ret, rhsn, lhsn)) { if (!popped || splatn || !compile_massign_opt(iseq, ret, rhsn, lhsn)) {
int llen = 0; int llen = 0;
@ -3765,12 +3765,12 @@ compile_massign(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node,
const NODE *postn = splatn->nd_2nd; const NODE *postn = splatn->nd_2nd;
const NODE *restn = splatn->nd_1st; const NODE *restn = splatn->nd_1st;
int num = (int)postn->nd_alen; int num = (int)postn->nd_alen;
int flag = 0x02 | (((VALUE)restn == (VALUE)-1) ? 0x00 : 0x01); int flag = 0x02 | ((restn == NODE_SPECIAL_NO_NAME_REST) ? 0x00 : 0x01);
ADD_INSN2(ret, nd_line(splatn), expandarray, ADD_INSN2(ret, nd_line(splatn), expandarray,
INT2FIX(num), INT2FIX(flag)); INT2FIX(num), INT2FIX(flag));
if ((VALUE)restn != (VALUE)-1) { if (restn != NODE_SPECIAL_NO_NAME_REST) {
CHECK(compile_massign_lhs(iseq, ret, restn)); CHECK(compile_massign_lhs(iseq, ret, restn));
} }
while (postn) { while (postn) {

12
node.c
View File

@ -366,12 +366,12 @@ dump_node(VALUE buf, VALUE indent, int comment, NODE *node)
ANN("example: a, b = foo"); ANN("example: a, b = foo");
F_NODE(nd_value, "rhsn"); F_NODE(nd_value, "rhsn");
F_NODE(nd_head, "lhsn"); F_NODE(nd_head, "lhsn");
if ((VALUE)node->nd_args != (VALUE)-1) { if (node->nd_args != NODE_SPECIAL_NO_NAME_REST) {
LAST_NODE; LAST_NODE;
F_NODE(nd_args, "splatn"); F_NODE(nd_args, "splatn");
} }
else { else {
F_MSG(nd_args, "splatn", "-1 (rest argument without name)"); F_MSG(nd_args, "splatn", "NODE_SPECIAL_NO_NAME_REST (rest argument without name)");
} }
return; return;
@ -402,8 +402,8 @@ dump_node(VALUE buf, VALUE indent, int comment, NODE *node)
asgn: asgn:
F_ID(nd_vid, "variable"); F_ID(nd_vid, "variable");
LAST_NODE; LAST_NODE;
if (node->nd_value == (NODE *)-1) { if (node->nd_value == NODE_SPECIAL_REQUIRED_KEYWORD) {
F_MSG(nd_value, "rvalue", "(required keyword argument)"); F_MSG(nd_value, "rvalue", "NODE_SPECIAL_REQUIRED_KEYWORD (required keyword argument)");
} }
else { else {
F_NODE(nd_value, "rvalue"); F_NODE(nd_value, "rvalue");
@ -983,11 +983,11 @@ dump_node(VALUE buf, VALUE indent, int comment, NODE *node)
ANN("post arguments"); ANN("post arguments");
ANN("format: *[nd_1st], [nd_2nd..] = .."); ANN("format: *[nd_1st], [nd_2nd..] = ..");
ANN("example: a, *rest, z = foo"); ANN("example: a, *rest, z = foo");
if ((VALUE)node->nd_1st != (VALUE)-1) { if (node->nd_1st != NODE_SPECIAL_NO_NAME_REST) {
F_NODE(nd_1st, "rest argument"); F_NODE(nd_1st, "rest argument");
} }
else { else {
F_MSG(nd_1st, "rest argument", "-1 (rest argument without name)"); F_MSG(nd_1st, "rest argument", "NODE_SPECIAL_NO_NAME_REST (rest argument without name)");
} }
LAST_NODE; LAST_NODE;
F_NODE(nd_2nd, "post arguments"); F_NODE(nd_2nd, "post arguments");

3
node.h
View File

@ -445,6 +445,9 @@ typedef struct RNode {
#define NEW_ATTRASGN(r,m,a) NEW_NODE(NODE_ATTRASGN,r,m,a) #define NEW_ATTRASGN(r,m,a) NEW_NODE(NODE_ATTRASGN,r,m,a)
#define NEW_PRELUDE(p,b,o) NEW_NODE(NODE_PRELUDE,p,b,o) #define NEW_PRELUDE(p,b,o) NEW_NODE(NODE_PRELUDE,p,b,o)
#define NODE_SPECIAL_REQUIRED_KEYWORD ((NODE *)-1)
#define NODE_SPECIAL_NO_NAME_REST ((NODE *)-1)
RUBY_SYMBOL_EXPORT_BEGIN RUBY_SYMBOL_EXPORT_BEGIN
typedef struct node_buffer_struct node_buffer_t; typedef struct node_buffer_struct node_buffer_t;

22
parse.y
View File

@ -1804,7 +1804,7 @@ mlhs_basic : mlhs_head
| mlhs_head tSTAR | mlhs_head tSTAR
{ {
/*%%%*/ /*%%%*/
$$ = new_masgn($1, (NODE *)-1, &@1); $$ = new_masgn($1, NODE_SPECIAL_NO_NAME_REST, &@1);
/*% /*%
$$ = mlhs_add_star($1, Qnil); $$ = mlhs_add_star($1, Qnil);
%*/ %*/
@ -1812,7 +1812,7 @@ mlhs_basic : mlhs_head
| mlhs_head tSTAR ',' mlhs_post | mlhs_head tSTAR ',' mlhs_post
{ {
/*%%%*/ /*%%%*/
$$ = new_masgn($1, new_postarg((NODE *)-1, $4, &@1), &@1); $$ = new_masgn($1, new_postarg(NODE_SPECIAL_NO_NAME_REST, $4, &@1), &@1);
/*% /*%
$1 = mlhs_add_star($1, Qnil); $1 = mlhs_add_star($1, Qnil);
$$ = mlhs_add_post($1, $4); $$ = mlhs_add_post($1, $4);
@ -1838,7 +1838,7 @@ mlhs_basic : mlhs_head
| tSTAR | tSTAR
{ {
/*%%%*/ /*%%%*/
$$ = new_masgn(0, (NODE *)-1, &@1); $$ = new_masgn(0, NODE_SPECIAL_NO_NAME_REST, &@1);
/*% /*%
$$ = mlhs_add_star(mlhs_new(), Qnil); $$ = mlhs_add_star(mlhs_new(), Qnil);
%*/ %*/
@ -1846,7 +1846,7 @@ mlhs_basic : mlhs_head
| tSTAR ',' mlhs_post | tSTAR ',' mlhs_post
{ {
/*%%%*/ /*%%%*/
$$ = new_masgn(0, new_postarg((NODE *)-1, $3, &@1), &@1); $$ = new_masgn(0, new_postarg(NODE_SPECIAL_NO_NAME_REST, $3, &@1), &@1);
/*% /*%
$$ = mlhs_add_star(mlhs_new(), Qnil); $$ = mlhs_add_star(mlhs_new(), Qnil);
$$ = mlhs_add_post($$, $3); $$ = mlhs_add_post($$, $3);
@ -3353,7 +3353,7 @@ f_margs : f_marg_list
| f_marg_list ',' tSTAR | f_marg_list ',' tSTAR
{ {
/*%%%*/ /*%%%*/
$$ = new_masgn($1, (NODE *)-1, &@1); $$ = new_masgn($1, NODE_SPECIAL_NO_NAME_REST, &@1);
/*% /*%
$$ = mlhs_add_star($1, Qnil); $$ = mlhs_add_star($1, Qnil);
%*/ %*/
@ -3361,7 +3361,7 @@ f_margs : f_marg_list
| f_marg_list ',' tSTAR ',' f_marg_list | f_marg_list ',' tSTAR ',' f_marg_list
{ {
/*%%%*/ /*%%%*/
$$ = new_masgn($1, new_postarg((NODE *)-1, $5, &@1), &@1); $$ = new_masgn($1, new_postarg(NODE_SPECIAL_NO_NAME_REST, $5, &@1), &@1);
/*% /*%
$$ = mlhs_add_star($1, Qnil); $$ = mlhs_add_star($1, Qnil);
$$ = mlhs_add_post($$, $5); $$ = mlhs_add_post($$, $5);
@ -3389,7 +3389,7 @@ f_margs : f_marg_list
| tSTAR | tSTAR
{ {
/*%%%*/ /*%%%*/
$$ = new_masgn(0, (NODE *)-1, &@1); $$ = new_masgn(0, NODE_SPECIAL_NO_NAME_REST, &@1);
/*% /*%
$$ = mlhs_add_star(mlhs_new(), Qnil); $$ = mlhs_add_star(mlhs_new(), Qnil);
%*/ %*/
@ -3397,7 +3397,7 @@ f_margs : f_marg_list
| tSTAR ',' f_marg_list | tSTAR ',' f_marg_list
{ {
/*%%%*/ /*%%%*/
$$ = new_masgn(0, new_postarg((NODE *)-1, $3, &@1), &@1); $$ = new_masgn(0, new_postarg(NODE_SPECIAL_NO_NAME_REST, $3, &@1), &@1);
/*% /*%
$$ = mlhs_add_star(mlhs_new(), Qnil); $$ = mlhs_add_star(mlhs_new(), Qnil);
$$ = mlhs_add_post($$, $3); $$ = mlhs_add_post($$, $3);
@ -4753,7 +4753,7 @@ f_kw : f_label arg_value
| f_label | f_label
{ {
current_arg = 0; current_arg = 0;
$$ = assignable($1, (NODE *)-1, &@1); $$ = assignable($1, NODE_SPECIAL_REQUIRED_KEYWORD, &@1);
/*%%%*/ /*%%%*/
$$ = new_kw_arg($$, &@1); $$ = new_kw_arg($$, &@1);
/*% /*%
@ -4773,7 +4773,7 @@ f_block_kw : f_label primary_value
} }
| f_label | f_label
{ {
$$ = assignable($1, (NODE *)-1, &@1); $$ = assignable($1, NODE_SPECIAL_REQUIRED_KEYWORD, &@1);
/*%%%*/ /*%%%*/
$$ = new_kw_arg($$, &@1); $$ = new_kw_arg($$, &@1);
/*% /*%
@ -10836,7 +10836,7 @@ new_args_tail_gen(struct parser_params *parser, NODE *k, ID kr, ID b, YYLTYPE *l
NODE *val_node = kwn->nd_body->nd_value; NODE *val_node = kwn->nd_body->nd_value;
ID vid = kwn->nd_body->nd_vid; ID vid = kwn->nd_body->nd_vid;
if (val_node == (NODE *)-1) { if (val_node == NODE_SPECIAL_REQUIRED_KEYWORD) {
vtable_add(required_kw_vars, vid); vtable_add(required_kw_vars, vid);
} }
else { else {