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

Re: [RFC/PATCH 01/48] builtin/apply: avoid parameter shadowing 'p_value' global

From
Christian Couder <christian.couder@gmail.com>
Date
Mar 10, 2016, 10:45 UTC
Message-ID
<CAP8UFD0UYsaz6ZatZCXuxmCc-ge_Tu3mL16Bz25EUFGf9ma1Ow@mail.gmail.com>
In-Reply-To
<CACsJy8Boz1XLv7yh5GsOQnQh1HF7RYoZ4rpQWWFc3PoTu=9m5w@mail.gmail.com>
On Thu, Mar 10, 2016 at 1:54 AM, Duy Nguyen <pclouds@gmail.com> wrote:
Show 33 quoted lines
> On Thu, Mar 10, 2016 at 6:27 AM, Junio C Hamano <gitster@pobox.com> wrote:
>> Christian Couder <christian.couder@gmail.com> writes:
>>
>>> Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
>>> ---
>>>  builtin/apply.c | 24 ++++++++++++------------
>>>  1 file changed, 12 insertions(+), 12 deletions(-)
>>
>> To be honest, I have to say that I do not like this change from
>> readability's point of view.  Once the global p_value becomes a
>> field in a "apply state" structure, functions will get a pointer to
>> the struct as a parameter, reference to it would be spelled as
>> "astate->p_value", while a local variable or a parameter would be
>> "p_value" and there is no shadowing issue.
>
> We could revert these local var rename patches at the end of the
> conversion, I think.
>
>> Also, you wouldn't be able to catch a misconversion in this patch
>> only from the patch text, if the conversion is done this way, would
>> you?  The patch may change the parameter p_value to p_v, and change
>> two references to p_value also to p_v, but it may leave another
>> reference to p_value that originally referred to the parameter
>> as-is, making it refer to the global, which would be a new bug
>> introduced by this conversion patch, but that remaining reference
>> would not show up in the patch.
>
> Yeah, I wish we have a semantic parser that can help with this sort of
> refactoring (can sparse do that?). Once we get AST tree, it should be
> easy to identify variable scope. Without it, maybe we can still rely
> on the compiler by renaming _both_ global and local vars to something
> else. That forces us (both patch writer and reviewers) to catch and
> examine every reference.

I agree that the change in the patch is not very nice. I can do one of the following:

1) do as Junio suggests, just discard this change and wait until
p_value is moved into apply_state for the problem to be solved; a
small downside of this is that if you compile with -Wshadow after each
change you will get some warnings until p_value is moved into
apply_state; I could move the patch to move p_value at the beginning
of the series but it is a bit involved and easier to review if it is
done towards the end,
2) revert these local var rename patches at the end of the conversion,
as Duy suggests
3) instead of renaming the local "p_value" variable, rename the global
"p_value" to maybe "state_p_value", so that when I move it into
apply_state I just need to s/state_p_value/state->p_value/.
I'd rather do 3) than 1) or 2) but I am also ok with 1) and 2).

Thanks, Christian.

Previous: Duy NguyenNext: Christian Couder
Message 5 of 58 in “Libifying git apply”
  1. 00/48 Libifying git applyChristian Couder, Mar 9, 2016
  2. 01/48 builtin/apply: avoid parameter shadowing 'p_value' globalChristian Couder, Mar 9, 2016
  3. Junio C HamanoMar 9, 2016
  4. Duy NguyenMar 10, 2016
  5. Christian CouderMar 10, 2016
  6. 02/48 builtin/apply: avoid parameter shadowing 'linenr' globalChristian Couder, Mar 9, 2016
  7. 03/48 builtin/apply: avoid local variable shadowing 'len' parameterChristian Couder, Mar 9, 2016
  8. 04/48 builtin/apply: extract line_by_line_fuzzy_match() from match_fragment()Christian Couder, Mar 9, 2016
  9. Stefan BellerMar 9, 2016
  10. Christian CouderMar 10, 2016
  11. 05/48 builtin/apply: move 'options' variable into cmd_apply()Christian Couder, Mar 9, 2016
  12. 06/48 builtin/apply: introduce 'struct apply_state' to start libifyingChristian Couder, Mar 9, 2016
  13. 07/48 builtin/apply: move 'newfd' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  14. 08/48 builtin/apply: move 'unidiff_zero' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  15. 09/48 builtin/apply: move 'check' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  16. 10/48 builtin/apply: move 'check_index' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  17. 11/48 builtin/apply: move 'apply_in_reverse' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  18. 12/48 builtin/apply: move 'apply_with_reject' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  19. 13/48 builtin/apply: move 'apply_verbosely' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  20. 14/48 builtin/apply: move 'update_index' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  21. 15/48 builtin/apply: move 'allow_overlap' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  22. 16/48 builtin/apply: move 'cached' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  23. 17/48 builtin/apply: move 'diffstat' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  24. 18/48 builtin/apply: move 'numstat' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  25. 19/48 builtin/apply: move 'summary' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  26. 20/48 builtin/apply: move 'threeway' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  27. 21/48 builtin/apply: move 'no-add' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  28. 22/48 builtin/apply: move 'unsafe_paths' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  29. 23/48 builtin/apply: move 'line_termination' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  30. 24/48 builtin/apply: move 'fake_ancestor' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  31. 25/48 builtin/apply: move 'p_context' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  32. 26/48 builtin/apply: move 'apply' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  33. 27/48 builtin/apply: move 'read_stdin' global into cmd_apply()Christian Couder, Mar 9, 2016
  34. 28/48 builtin/apply: move 'lock_file' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  35. 29/48 builtin/apply: move 'patch_input_file' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  36. 30/48 builtin/apply: move 'limit_by_name' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  37. 31/48 builtin/apply: move 'has_include' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  38. 32/48 builtin/apply: move 'p_value' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  39. 33/48 builtin/apply: move 'p_value_known' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  40. 34/48 builtin/apply: move 'root' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  41. 35/48 builtin/apply: move 'whitespace_error' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  42. 36/48 builtin/apply: move 'whitespace_option' into 'struct apply_state'Christian Couder, Mar 9, 2016
  43. 37/48 builtin/apply: remove whitespace_option arg from set_default_whitespace_mode()Christian Couder, Mar 9, 2016
  44. 38/48 builtin/apply: move 'squelch_whitespace_errors' into 'struct apply_state'Christian Couder, Mar 9, 2016
  45. 39/48 builtin/apply: move 'applied_after_fixing_ws' into 'struct apply_state'Christian Couder, Mar 9, 2016
  46. 40/48 builtin/apply: move 'ws_error_action' into 'struct apply_state'Christian Couder, Mar 9, 2016
  47. 41/48 builtin/apply: move 'ws_ignore_action' into 'struct apply_state'Christian Couder, Mar 9, 2016
  48. 42/48 builtin/apply: move 'max_change' and 'max_len' into 'struct apply_state'Christian Couder, Mar 9, 2016
  49. 43/48 builtin/apply: move 'linenr' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  50. 44/48 builtin/apply: move 'fn_table' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  51. 45/48 builtin/apply: move 'symlink_changes' global into 'struct apply_state'Christian Couder, Mar 9, 2016
  52. 46/48 builtin/apply: move 'state' init into init_apply_state()Christian Couder, Mar 9, 2016
  53. 47/48 builtin/apply: move 'state' check into check_apply_state()Christian Couder, Mar 9, 2016
  54. 48/48 builtin/apply: move applying patches into apply_all_patches()Christian Couder, Mar 9, 2016
  55. Junio C HamanoMar 9, 2016
  56. Christian CouderMar 11, 2016
  57. Duy NguyenMar 10, 2016
  58. Christian CouderMar 11, 2016

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.