Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> writes: > Keep track of all recognized macros in the new "maybe_macro" field. > This this field is true, it _may_ be a macro (depending on what's in > the current attr stack). But if the field is false, it's definitely > not a macro, no need to go through the whole attr stack in > macroexpand_one() to search for one. > > Without this, "git grep abcdefghi" on git.git hits the inner loop in > macroexpand_one() about 2500 times. With this, it's about 60 times. Nice ;-) > > Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> > --- > attr.c | 10 +++++++--- > 1 file changed, 7 insertions(+), 3 deletions(-) > > diff --git a/attr.c b/attr.c > index def09c7..4ec6186 100644 > --- a/attr.c > +++ b/attr.c > @@ -32,6 +32,7 @@ struct git_attr { > struct git_attr *next; > unsigned h; > int attr_nr; > + int maybe_macro; > char name[FLEX_ARRAY]; > }; > static int git_attr_nr; > @@ -95,6 +96,7 @@ static struct git_attr *git_attr_internal(const char *name, int len) > a->h = hval; > a->next = git_attr_hash[pos]; > a->attr_nr = git_attr_nr++; > + a->maybe_macro = 0; > git_attr_hash[pos] = a; > > REALLOC_ARRAY(check_all_attr, git_attr_nr); > @@ -244,9 +246,10 @@ static struct match_attr *parse_attr_line(const char *line, const char *src, > sizeof(*res) + > sizeof(struct attr_state) * num_attr + > (is_macro ? 0 : namelen + 1)); > - if (is_macro) > + if (is_macro) { > res->u.attr = git_attr_internal(name, namelen); > - else { > + res->u.attr->maybe_macro = 1; > + } else { > char *p = (char *)&(res->state[num_attr]); > memcpy(p, name, namelen); > res->u.pat.pattern = p; > @@ -687,7 +690,8 @@ static int macroexpand_one(int attr_nr, int rem) > struct match_attr *a = NULL; > int i; > > - if (check_all_attr[attr_nr].value != ATTR__TRUE) > + if (check_all_attr[attr_nr].value != ATTR__TRUE || > + !check_all_attr[attr_nr].attr->maybe_macro) > return rem; > > for (stk = attr_stack; !a && stk; stk = stk->prev) -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html