aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRené Scharfe <rene.scharfe@lsrfire.ath.cx>2009-03-07 13:27:15 +0100
committerJunio C Hamano <gitster@pobox.com>2009-03-07 11:34:53 -0800
commit252d560d215581637fcddd7a0a18f89204ecc8d1 (patch)
tree2dcb202b0e77bdf077537425231461f917624515
parent8cc3fe45c92a2e85400a6ee83c3b3a4a8ca1d6c7 (diff)
downloadgit-252d560d215581637fcddd7a0a18f89204ecc8d1.tar.gz
git-252d560d215581637fcddd7a0a18f89204ecc8d1.tar.xz
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>
-rw-r--r--grep.c10
1 files changed, 3 insertions, 7 deletions
diff --git a/grep.c b/grep.c
index 062b2b6f2..db341b679 100644
--- a/grep.c
+++ b/grep.c
@@ -394,13 +394,9 @@ static int match_expr_eval(struct grep_opt *o,
h = !match_expr_eval(o, x->u.unary, bol, eol, ctx, 0);
break;
case GREP_NODE_AND:
- if (!collect_hits)
- return (match_expr_eval(o, x->u.binary.left,
- bol, eol, ctx, 0) &&
- match_expr_eval(o, x->u.binary.right,
- bol, eol, ctx, 0));
- h = match_expr_eval(o, x->u.binary.left, bol, eol, ctx, 0);
- h &= match_expr_eval(o, x->u.binary.right, bol, eol, ctx, 0);
+ if (!match_expr_eval(o, x->u.binary.left, bol, eol, ctx, 0))
+ return 0;
+ h = match_expr_eval(o, x->u.binary.right, bol, eol, ctx, 0);
break;
case GREP_NODE_OR:
if (!collect_hits)