aboutsummaryrefslogtreecommitdiffstats
path: root/parse.y
diff options
context:
space:
mode:
authormame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-09-14 05:27:02 +0000
committermame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-09-14 05:27:02 +0000
commit33adf313bdae2b427a72e8b642962b91cdaf6523 (patch)
tree787002814cee9110d387332bca69770f62394e40 /parse.y
parent0391381caaa3d4f580e862299f662df107435100 (diff)
downloadruby-33adf313bdae2b427a72e8b642962b91cdaf6523.tar.gz
Introduce NODE_UNLESS for branch coverage
`unless` statement was a syntactic sugar for `if` statement, which made the result of branch coverage hard to understand. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59889 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y13
1 files changed, 12 insertions, 1 deletions
diff --git a/parse.y b/parse.y
index 004e2420b5..ccd760aa68 100644
--- a/parse.y
+++ b/parse.y
@@ -352,7 +352,8 @@ static NODE *cond_gen(struct parser_params*,NODE*,int);
#define new_nil() NEW_NIL()
static NODE *new_if_gen(struct parser_params*,NODE*,NODE*,NODE*);
#define new_if(cc,left,right) new_if_gen(parser, (cc), (left), (right))
-#define new_unless(cc,left,right) new_if_gen(parser, (cc), (right), (left))
+static NODE *new_unless_gen(struct parser_params*,NODE*,NODE*,NODE*);
+#define new_unless(cc,left,right) new_unless_gen(parser, (cc), (left), (right))
static NODE *logop_gen(struct parser_params*,enum node_type,NODE*,NODE*);
#define logop(id,node1,node2) \
logop_gen(parser, ((id)==idAND||(id)==idANDOP)?NODE_AND:NODE_OR, \
@@ -9533,6 +9534,7 @@ value_expr_gen(struct parser_params *parser, NODE *node)
break;
case NODE_IF:
+ case NODE_UNLESS:
if (!node->nd_body) {
node = node->nd_else;
break;
@@ -9711,6 +9713,7 @@ reduce_nodes_gen(struct parser_params *parser, NODE **body)
body = &node->nd_end->nd_head;
break;
case NODE_IF:
+ case NODE_UNLESS:
if (subnodes(nd_body, nd_else)) break;
return;
case NODE_CASE:
@@ -9914,6 +9917,14 @@ new_if_gen(struct parser_params *parser, NODE *cc, NODE *left, NODE *right)
}
static NODE*
+new_unless_gen(struct parser_params *parser, NODE *cc, NODE *left, NODE *right)
+{
+ if (!cc) return right;
+ cc = cond0(parser, cc, FALSE);
+ return newline_node(NEW_UNLESS(cc, left, right));
+}
+
+static NODE*
logop_gen(struct parser_params *parser, enum node_type type, NODE *left, NODE *right)
{
value_expr(left);