Re: [PATCH 2/3] commit: add function to unparse a commit and its parents
- From
Christian Couder <chriscool@tuxfamily.org>
- Date
- May 27, 2009, 05:12 UTC
- Message-ID
- <200905270712.36866.chriscool@tuxfamily.org>
- In-Reply-To
- <alpine.DEB.1.00.0905251140320.4288@intel-tinevez-2-302>
Hi,
Le Monday 25 May 2009, Johannes Schindelin a écrit :
Show 47 quoted lines
> Hi,
>
> On Mon, 25 May 2009, Johannes Sixt wrote:
> > Christian Couder schrieb:
> > > +static void unparse_commit_list(struct commit_list *list)
> > > +{
> > > + for (; list; list = list->next)
> > > + unparse_commit(list->item);
> > > +}
> > > +
> > > +void unparse_commit(struct commit *item)
> > > +{
> > > + item->object.flags = 0;
> > > + item->object.used = 0;
> > > + if (item->object.parsed) {
> > > + item->object.parsed = 0;
> > > + if (item->parents) {
> > > + unparse_commit_list(item->parents);
> > > + free_commit_list(item->parents);
> > > + item->parents = NULL;
> > > + }
> > > + }
> > > +}
> >
> > I see a recursion here. Could this not overflow the stack if there is a
> > long ancestry chain?
>
> You mean tail recursion, i.e. something like
>
> void unparse_commit(struct commit *item)
> {
> item->object.flags = 0;
> item->object.used = 0;
> while (item->object.parsed) {
> struct commit *first;
>
> item->object.parsed = 0;
> if (!item->parents)
> break;
> if (item->parents->next)
> unparse_commit_list(item->parents->next);
> first = item->parents->item;
> free_commit_list(item->parents);
> item->parents = NULL;
> item = first;
> }
> }Yes, it is better like this. Thanks and sorry about responding late.
> However, I am a bit concerned that this function is dangerous, as it just > assumes that there is no reference to the commits left, which assumption > is _very_ easy to break by mistake.
Anyway I will send a 2 patch series that will use clear_commit_marks instead of this function.
Thanks, Christian.