aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-03-20 13:30:57 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-03-20 13:30:57 +0000
commitb4b3de3e7ce9ecfdaf1df75e94dd8e4f6342e34e (patch)
tree84e91e45cf3224f60a09643c2b91cbc403caf3b2
parent798316eac260e3cd683da2be23fef53ee64cee00 (diff)
downloadruby-b4b3de3e7ce9ecfdaf1df75e94dd8e4f6342e34e.tar.gz
node.c: predicates for special NODEs
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62861 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--compile.c6
-rw-r--r--ext/-test-/ast/ast.c6
-rw-r--r--node.c8
-rw-r--r--node.h2
-rw-r--r--parse.y3
5 files changed, 13 insertions, 12 deletions
diff --git a/compile.c b/compile.c
index 806c86f72a..8ffaef2fdf 100644
--- a/compile.c
+++ b/compile.c
@@ -4088,7 +4088,7 @@ compile_massign(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node,
const NODE *rhsn = node->nd_value;
const NODE *splatn = node->nd_args;
const NODE *lhsn = node->nd_head;
- int lhs_splat = (splatn && splatn != NODE_SPECIAL_NO_NAME_REST) ? 1 : 0;
+ int lhs_splat = (splatn && NODE_NAMED_REST_P(splatn)) ? 1 : 0;
if (!popped || splatn || !compile_massign_opt(iseq, ret, rhsn, lhsn)) {
int llen = 0;
@@ -4145,12 +4145,12 @@ compile_massign(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node,
const NODE *postn = splatn->nd_2nd;
const NODE *restn = splatn->nd_1st;
int num = (int)postn->nd_alen;
- int flag = 0x02 | ((restn == NODE_SPECIAL_NO_NAME_REST) ? 0x00 : 0x01);
+ int flag = 0x02 | (NODE_NAMED_REST_P(restn) ? 0x01 : 0x00);
ADD_INSN2(ret, nd_line(splatn), expandarray,
INT2FIX(num), INT2FIX(flag));
- if (restn != NODE_SPECIAL_NO_NAME_REST) {
+ if (NODE_NAMED_REST_P(restn)) {
CHECK(compile_massign_lhs(iseq, ret, restn));
}
while (postn) {
diff --git a/ext/-test-/ast/ast.c b/ext/-test-/ast/ast.c
index eab1cfb99a..b5be606499 100644
--- a/ext/-test-/ast/ast.c
+++ b/ext/-test-/ast/ast.c
@@ -239,7 +239,7 @@ node_children(rb_ast_t *ast, NODE *node)
return ary;
}
case NODE_MASGN:
- if (node->nd_args != NODE_SPECIAL_NO_NAME_REST) {
+ if (NODE_NAMED_REST_P(node->nd_args)) {
return rb_ary_new_from_node_args(ast, 3, node->nd_value, node->nd_head, node->nd_args);
}
return rb_ary_new_from_node_args(ast, 2, node->nd_value, node->nd_head);
@@ -253,7 +253,7 @@ node_children(rb_ast_t *ast, NODE *node)
goto asgn;
case NODE_CVASGN:
asgn:
- if (node->nd_value == NODE_SPECIAL_REQUIRED_KEYWORD) {
+ if (NODE_REQUIRED_KEYWORD_P(node)) {
return rb_ary_new_from_node_args(ast, 0);
}
return rb_ary_new_from_node_args(ast, 1, node->nd_value);
@@ -404,7 +404,7 @@ node_children(rb_ast_t *ast, NODE *node)
case NODE_KW_ARG:
return rb_ary_new_from_node_args(ast, 2, node->nd_body, node->nd_next);
case NODE_POSTARG:
- if (node->nd_1st != NODE_SPECIAL_NO_NAME_REST) {
+ if (NODE_NAMED_REST_P(node->nd_1st)) {
return rb_ary_new_from_node_args(ast, 2, node->nd_1st, node->nd_2nd);
}
return rb_ary_new_from_node_args(ast, 1, node->nd_2nd);
diff --git a/node.c b/node.c
index e17067157f..d41b330b5c 100644
--- a/node.c
+++ b/node.c
@@ -342,7 +342,7 @@ dump_node(VALUE buf, VALUE indent, int comment, const NODE * node)
ANN("example: a, b = foo");
F_NODE(nd_value, "rhsn");
F_NODE(nd_head, "lhsn");
- if (node->nd_args != NODE_SPECIAL_NO_NAME_REST) {
+ if (NODE_NAMED_REST_P(node->nd_args)) {
LAST_NODE;
F_NODE(nd_args, "splatn");
}
@@ -356,7 +356,7 @@ dump_node(VALUE buf, VALUE indent, int comment, const NODE * node)
ANN("format: [nd_vid](lvar) = [nd_value]");
ANN("example: x = foo");
F_ID(nd_vid, "local variable");
- if (node->nd_value == NODE_SPECIAL_REQUIRED_KEYWORD) {
+ if (NODE_REQUIRED_KEYWORD_P(node)) {
F_MSG(nd_value, "rvalue", "NODE_SPECIAL_REQUIRED_KEYWORD (required keyword argument)");
}
else {
@@ -377,7 +377,7 @@ dump_node(VALUE buf, VALUE indent, int comment, const NODE * node)
ANN("format: [nd_vid](current dvar) = [nd_value]");
ANN("example: 1.times { x = foo }");
F_ID(nd_vid, "local variable");
- if (node->nd_value == NODE_SPECIAL_REQUIRED_KEYWORD) {
+ if (NODE_REQUIRED_KEYWORD_P(node)) {
F_MSG(nd_value, "rvalue", "NODE_SPECIAL_REQUIRED_KEYWORD (required keyword argument)");
}
else {
@@ -955,7 +955,7 @@ dump_node(VALUE buf, VALUE indent, int comment, const NODE * node)
ANN("post arguments");
ANN("format: *[nd_1st], [nd_2nd..] = ..");
ANN("example: a, *rest, z = foo");
- if (node->nd_1st != NODE_SPECIAL_NO_NAME_REST) {
+ if (NODE_NAMED_REST_P(node->nd_1st)) {
F_NODE(nd_1st, "rest argument");
}
else {
diff --git a/node.h b/node.h
index 9cd66da5a8..9a375619f1 100644
--- a/node.h
+++ b/node.h
@@ -469,7 +469,9 @@ typedef struct RNode {
#define NEW_ATTRASGN(r,m,a,loc) NEW_NODE(NODE_ATTRASGN,r,m,a,loc)
#define NODE_SPECIAL_REQUIRED_KEYWORD ((NODE *)-1)
+#define NODE_REQUIRED_KEYWORD_P(node) ((node)->nd_value == NODE_SPECIAL_REQUIRED_KEYWORD)
#define NODE_SPECIAL_NO_NAME_REST ((NODE *)-1)
+#define NODE_NAMED_REST_P(node) ((node) != NODE_SPECIAL_NO_NAME_REST)
RUBY_SYMBOL_EXPORT_BEGIN
diff --git a/parse.y b/parse.y
index b85637f0ae..fc0e15b890 100644
--- a/parse.y
+++ b/parse.y
@@ -9955,10 +9955,9 @@ new_args_tail(struct parser_params *p, NODE *kw_args, ID kw_rest_arg, ID block,
int i;
while (kwn) {
- NODE *val_node = kwn->nd_body->nd_value;
ID vid = kwn->nd_body->nd_vid;
- if (val_node == NODE_SPECIAL_REQUIRED_KEYWORD) {
+ if (NODE_REQUIRED_KEYWORD_P(kwn->nd_body)) {
vtable_add(required_kw_vars, vid);
}
else {