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; } } 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. Ciao, Dscho -- 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