git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 2/3] untracked-cache: simplify parsing by dropping "next"

From
Junio C Hamano <gitster@pobox.com>
Date
Apr 19, 2019, 05:33 UTC
Message-ID
<xmqq5zraeezm.fsf@gitster-ct.c.googlers.com>
In-Reply-To
<20190418211738.GB18520@sigill.intra.peff.net>
Jeff King <peff@peff.net> writes:
Show 8 quoted lines
> When we parse an on-disk untracked cache, we have two pointers, "data"
> and "next". As we parse, we point "next" to the end of an element, and
> then later update "data" to match.
>
> But we actually don't need two pointers. Each parsing step can just
> update "data" directly from other variables we hold (and we don't have
> to worry about bailing in an intermediate state, since any parsing
> failure causes us to immediately discard "data" and return).
;-)  

My first reaction was "you can do so now you have introduced eos--why didn't you do that in the previous step?", but losing 'next' from the varint parsing step would certainly have been possible even before that change. So I agree that it makes much more sense to do this step separately from the previous one.

The code after the patch certainly reads easier and simpler.
Thanks.
Show 67 quoted lines
> Signed-off-by: Jeff King <peff@peff.net>
> ---
>  dir.c | 20 +++++++-------------
>  1 file changed, 7 insertions(+), 13 deletions(-)
>
> diff --git a/dir.c b/dir.c
> index 7b0513c476..17865f44df 100644
> --- a/dir.c
> +++ b/dir.c
> @@ -2732,50 +2732,44 @@ static int read_one_dir(struct untracked_cache_dir **untracked_,
>  			struct read_data *rd)
>  {
>  	struct untracked_cache_dir ud, *untracked;
> -	const unsigned char *next, *data = rd->data, *end = rd->end;
> +	const unsigned char *data = rd->data, *end = rd->end;
>  	const unsigned char *eos;
>  	unsigned int value;
>  	int i, len;
>  
>  	memset(&ud, 0, sizeof(ud));
>  
> -	next = data;
> -	value = decode_varint(&next);
> -	if (next > end)
> +	value = decode_varint(&data);
> +	if (data > end)
>  		return -1;
>  	ud.recurse	   = 1;
>  	ud.untracked_alloc = value;
>  	ud.untracked_nr	   = value;
>  	if (ud.untracked_nr)
>  		ALLOC_ARRAY(ud.untracked, ud.untracked_nr);
> -	data = next;
>  
> -	next = data;
> -	ud.dirs_alloc = ud.dirs_nr = decode_varint(&next);
> -	if (next > end)
> +	ud.dirs_alloc = ud.dirs_nr = decode_varint(&data);
> +	if (data > end)
>  		return -1;
>  	ALLOC_ARRAY(ud.dirs, ud.dirs_nr);
> -	data = next;
>  
>  	eos = memchr(data, '\0', end - data);
>  	if (!eos || eos == end)
>  		return -1;
>  	len = eos - data;
> -	next = eos + 1;
>  
>  	*untracked_ = untracked = xmalloc(st_add3(sizeof(*untracked), len, 1));
>  	memcpy(untracked, &ud, sizeof(ud));
>  	memcpy(untracked->name, data, len + 1);
> -	data = next;
> +	data = eos + 1;
>  
>  	for (i = 0; i < untracked->untracked_nr; i++) {
>  		eos = memchr(data, '\0', end - data);
>  		if (!eos || eos == end)
>  			return -1;
>  		len = eos - data;
> -		next = eos + 1;
>  		untracked->untracked[i] = xmemdupz(data, len);
> -		data = next;
> +		data = eos + 1;
>  	}
>  
>  	rd->ucd[rd->index++] = untracked;
Previous: Jeff KingNext: Jeff King
Message 9 of 13 in “Fix an off-by-one bug in the untracked cache code”
  1. 0/1 Fix an off-by-one bug in the untracked cache codeJohannes Schindelin via GitGitGadget, Apr 10, 2019
  2. 1/1 untracked cache: fix off-by-oneJohannes Schindelin via GitGitGadget, Apr 10, 2019
  3. Jeff KingApr 10, 2019
  4. Junio C HamanoApr 12, 2019
  5. 0/3 untracked cache parsing fixupsJeff King, Apr 18, 2019
  6. 1/3 untracked-cache: be defensive about missing NULs in indexJeff King, Apr 18, 2019
  7. Junio C HamanoApr 19, 2019
  8. 2/3 untracked-cache: simplify parsing by dropping "next"Jeff King, Apr 18, 2019
  9. Junio C HamanoApr 19, 2019
  10. 3/3 untracked-cache: simplify parsing by dropping "len"Jeff King, Apr 18, 2019
  11. 4/3 untracked-cache: use FLEX_ALLOC to create internal structsJeff King, Apr 18, 2019
  12. Duy NguyenApr 19, 2019
  13. Jeff KingApr 19, 2019

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.