@matheusbsbs / matheus-bagliano / commits / 252d560d21
Fork 0

grep: micro-optimize hit collection for AND nodes

In addition to returning if an expression matches a line, match_expr_eval() updates the expression's hit flag if the parameter collect_hits is set. It never sets collect_hits for children of AND nodes, though, so their hit flag will never be updated. Because of that we can return early if the first child didn't match, no matter if collect_hits is set or not. Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx> Signed-off-by: Junio C Hamano <gitster@pobox.com>

René Scharfe committed Mar 7, 2009 at 13:27 UTC 252d560d215581637fcddd7a0a18f89204ecc8d1
1 file changed +3 -7
grep.c
+3 -7
@@ -394,13 +394,9 @@ static int match_expr_eval(struct grep_opt *o,
394 h = !match_expr_eval(o, x->u.unary, bol, eol, ctx, 0);
395 break;
396 case GREP_NODE_AND:
397 - if (!collect_hits)
398 - return (match_expr_eval(o, x->u.binary.left,
399 - bol, eol, ctx, 0) &&
400 - match_expr_eval(o, x->u.binary.right,
401 - bol, eol, ctx, 0));
402 - h = match_expr_eval(o, x->u.binary.left, bol, eol, ctx, 0);
403 - h &= match_expr_eval(o, x->u.binary.right, bol, eol, ctx, 0);
397 + if (!match_expr_eval(o, x->u.binary.left, bol, eol, ctx, 0))
398 + return 0;
399 + h = match_expr_eval(o, x->u.binary.right, bol, eol, ctx, 0);
400 break;
401 case GREP_NODE_OR:
402 if (!collect_hits)