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

Re: [PATCH v3 02/23] ref-filter: add return value to some functions

From
Jeff King <peff@peff.net>
Date
Feb 15, 2018, 05:16 UTC
Message-ID
<20180215051658.GB18780@sigill.intra.peff.net>
In-Reply-To
<01020161890f4311-ab635cac-1d48-47ee-90e1-f178f134db1c-000000@eu-west-1.amazonses.com>
On Mon, Feb 12, 2018 at 08:08:54AM +0000, Olga Telezhnaya wrote:
> Add return flag to format_ref_array_item(), show_ref_array_item(),
> get_ref_array_info() and populate_value() for further using.
> Need it to handle situations when item is broken but we can not invoke
> die() because we are in batch mode and all items need to be processed.

OK. The source of these errors would eventually be calls in populate_value(), but we don't flag any errors there yet (well, we do, but they all end up in die() for now). So I'd expect to see later in the series those die() calls converted to errors (I haven't looked further yet; just making a note to myself).

Show 8 quoted lines
> --- a/ref-filter.c
> +++ b/ref-filter.c
> @@ -1356,8 +1356,9 @@ static const char *get_refname(struct used_atom *atom, struct ref_array_item *re
>  
>  /*
>   * Parse the object referred by ref, and grab needed value.
> + * Return 0 if everything was successful, -1 otherwise.
>   */

We discussed off-list the concept that the caller may want to know one of three outcomes:

  - we completed the request, having accessed the object
  - we completed the request, but it didn't require accessing any
    objects
  - an error occurred accessing the object

Since callers like "cat-file" would need to check has_sha1_file() manually in the second case. Should this return value actually be an enum, which would make it easier to convert later to a tri-state?

Show 11 quoted lines
> -static void populate_value(struct ref_array_item *ref)
> +static int populate_value(struct ref_array_item *ref)
>  {
>  	void *buf;
>  	struct object *obj;
> @@ -1482,7 +1483,7 @@ static void populate_value(struct ref_array_item *ref)
>  		}
>  	}
>  	if (used_atom_cnt <= i)
> -		return;
> +		return 0;

Most of these conversions are obviously correct, because they just turn a void return into one with a value. But this one is trickier:

Show 13 quoted lines
> @@ -2138,9 +2144,10 @@ void format_ref_array_item(struct ref_array_item *info,
>  		ep = strchr(sp, ')');
>  		if (cp < sp)
>  			append_literal(cp, sp, &state);
> -		get_ref_atom_value(info,
> -				   parse_ref_filter_atom(format, sp + 2, ep),
> -				   &atomv);
> +		if (get_ref_atom_value(info,
> +				       parse_ref_filter_atom(format, sp + 2, ep),
> +				       &atomv))
> +			return -1;
>  		atomv->handler(atomv, &state);
>  	}

since it affects the control flow. Might we be skipping any necessary cleanup in the function if we see an error?

It looks like we may have called push_stack_element(), but we'd never get to the end of the function where we call pop_stack_element(), causing us to leak.

-Peff
Previous: Olga TelezhnayaNext: Оля Тележная
Message 30 of 56 in “ref-filter: get rid of goto”
  1. 01/23 ref-filter: get rid of gotoOlga Telezhnaya, Feb 12, 2018
  2. 03/23 cat-file: reuse struct ref_formatOlga Telezhnaya, Feb 12, 2018
  3. Jeff KingFeb 15, 2018
  4. 08/23 ref-filter: reuse parse_ref_filter_atom()Olga Telezhnaya, Feb 12, 2018
  5. Jeff KingFeb 15, 2018
  6. Оля ТележнаяFeb 15, 2018
  7. 04/23 ref-filter: make valid_atom as function parameterOlga Telezhnaya, Feb 12, 2018
  8. Jeff KingFeb 15, 2018
  9. Оля ТележнаяFeb 15, 2018
  10. 11/23 ref-filter: rename field in ref_array_item stuctOlga Telezhnaya, Feb 12, 2018
  11. 07/23 cat-file: start migrating formatting to ref-filterOlga Telezhnaya, Feb 12, 2018
  12. Jeff KingFeb 15, 2018
  13. 19/23 ref-filter: make populate_value() internal againOlga Telezhnaya, Feb 12, 2018
  14. 16/23 ref-filter: make cat_file_info independentOlga Telezhnaya, Feb 12, 2018
  15. Jeff KingFeb 15, 2018
  16. Оля ТележнаяFeb 15, 2018
  17. Jeff KingFeb 16, 2018
  18. 20/23 ref-filter: unifying formatting of cat-file optsOlga Telezhnaya, Feb 12, 2018
  19. Jeff KingFeb 15, 2018
  20. Оля ТележнаяFeb 15, 2018
  21. Junio C HamanoFeb 15, 2018
  22. 10/23 ref-filter: make populate_value() globalOlga Telezhnaya, Feb 12, 2018
  23. 15/23 cat-file: move skip_object_info into ref-filterOlga Telezhnaya, Feb 12, 2018
  24. Jeff KingFeb 15, 2018
  25. Оля ТележнаяFeb 15, 2018
  26. 21/23 for-each-ref: tests for new atoms addedOlga Telezhnaya, Feb 12, 2018
  27. Jeff KingFeb 15, 2018
  28. Оля ТележнаяFeb 15, 2018
  29. 02/23 ref-filter: add return value to some functionsOlga Telezhnaya, Feb 12, 2018
  30. Jeff KingFeb 15, 2018
  31. Оля ТележнаяFeb 15, 2018
  32. 09/23 cat-file: start use ref_array_item structOlga Telezhnaya, Feb 12, 2018
  33. Jeff KingFeb 15, 2018
  34. Оля ТележнаяFeb 15, 2018
  35. 18/23 cat-file: reuse printing logic from ref-filterOlga Telezhnaya, Feb 12, 2018
  36. 05/23 cat-file: move struct expand_data into ref-filterOlga Telezhnaya, Feb 12, 2018
  37. Jeff KingFeb 15, 2018
  38. 23/23 cat-file: update of docsOlga Telezhnaya, Feb 12, 2018
  39. Jeff KingFeb 15, 2018
  40. 12/23 cat-file: start reusing populate_value()Olga Telezhnaya, Feb 12, 2018
  41. Jeff KingFeb 15, 2018
  42. 14/23 ref_filter: add is_atom_used functionOlga Telezhnaya, Feb 12, 2018
  43. Jeff KingFeb 15, 2018
  44. Оля ТележнаяFeb 15, 2018
  45. 17/23 ref-filter: make valid_atom general againOlga Telezhnaya, Feb 12, 2018
  46. Jeff KingFeb 15, 2018
  47. 13/23 ref-filter: get rid of mark_atom_in_object_info()Olga Telezhnaya, Feb 12, 2018
  48. Jeff KingFeb 15, 2018
  49. Оля ТележнаяFeb 15, 2018
  50. 22/23 cat-file: tests for new atoms addedOlga Telezhnaya, Feb 12, 2018
  51. Adam DinwoodieFeb 16, 2018
  52. Ramsay JonesFeb 18, 2018
  53. Ramsay JonesFeb 19, 2018
  54. 06/23 cat-file: split expand_atom() into 2 functionsOlga Telezhnaya, Feb 12, 2018
  55. Jeff KingFeb 15, 2018
  56. Jeff KingFeb 15, 2018

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.