Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> writes: > It's done so that commit->util can be removed. See more explanation in > the commit that removes commit->util. > > Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> > --- > blame.c | 42 +++++++++++++++++++++++++++++++----------- > blame.h | 2 ++ > builtin/blame.c | 2 +- > 3 files changed, 34 insertions(+), 12 deletions(-) > > diff --git a/blame.c b/blame.c > index 78c9808bd1..18e8bd996a 100644 > --- a/blame.c > +++ b/blame.c > @@ -6,6 +6,24 @@ > #include "diffcore.h" > #include "tag.h" > #include "blame.h" > +#include "commit-slab.h" > + > +define_commit_slab(blame_suspects, struct blame_origin *); > +static struct blame_suspects blame_suspects; > + > +struct blame_origin *get_blame_suspects(struct commit *commit) > +{ > + struct blame_origin **result; > + > + result = blame_suspects_peek(&blame_suspects, commit); > + > + return result ? *result : NULL; > +} > + > +static void set_blame_suspects(struct commit *commit, struct blame_origin *origin) > +{ > + *blame_suspects_at(&blame_suspects, commit) = origin; > +} > > void blame_origin_decref(struct blame_origin *o) > { This makes really a pleasant read. With these helpers in place, the remainder of this patch becomes mechanical substitution to call get_blame_suspects when commit->util appears on the RHS of an expression and set_blame_suspects when commit->util gets assigned. > @@ -15,12 +33,12 @@ void blame_origin_decref(struct blame_origin *o) > blame_origin_decref(o->previous); > free(o->file.ptr); > /* Should be present exactly once in commit chain */ > - for (p = o->commit->util; p; l = p, p = p->next) { > + for (p = get_blame_suspects(o->commit); p; l = p, p = p->next) { > if (p == o) { > if (l) > l->next = p->next; > else > - o->commit->util = p->next; > + set_blame_suspects(o->commit, p->next); > free(o); > return; > }