Browse Source

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>
maint
René Scharfe 16 years ago committed by Junio C Hamano
parent
commit
252d560d21
  1. 10
      grep.c

10
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); h = !match_expr_eval(o, x->u.unary, bol, eol, ctx, 0);
break; break;
case GREP_NODE_AND: case GREP_NODE_AND:
if (!collect_hits) if (!match_expr_eval(o, x->u.binary.left, bol, eol, ctx, 0))
return (match_expr_eval(o, x->u.binary.left, return 0;
bol, eol, ctx, 0) && h = match_expr_eval(o, x->u.binary.right, 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);
break; break;
case GREP_NODE_OR: case GREP_NODE_OR:
if (!collect_hits) if (!collect_hits)

Loading…
Cancel
Save