Re: [GSoC][PATCH] {apply,alias}: convert pre-processor macros to enums
- From
Vinayak Dev <vinayakdev.sci@gmail.com>
- Date
- Feb 10, 2023, 11:20 UTC
- Message-ID
- <CADE8NappDSaZrMLeqak4is59oL=X1wJOj2eCLLjaCKyrnoK9PQ@mail.gmail.com>
- In-Reply-To
- <CAPig+cT1EtPO2FLvTsw3SjgCgk=ovNwY77hsX6p7ETKiq8aNog@mail.gmail.com>
On Fri, 10 Feb 2023 at 16:15, Eric Sunshine <sunshine@sunshineco.com> wrote:
Thanks a lot for replying!
Show 8 quoted lines
> On Thu, Feb 9, 2023 at 12:00 PM Vinayak Dev <vinayakdev.sci@gmail.com> wrote:
> > {apply,alias}: convert pre-processor macros to enums
>
> Thanks for submitting a GSoC microproject. Let's take a look...
>
> > Groups related #define macros into enums in apply.c and alias.c .
>
> s/Groups/Group/Thanks for pointing this out. I will keep note of removing the /s/ in further patches.
Show 31 quoted lines
>
> > The changed #define macros are related constants, so it makes sense to group them.
>
> They already have a common prefix and are grouped textually, so it's
> obvious to readers that they are related, thus this isn't necessarily
> a good selling point for such a change.
>
> > This also makes debugging easier, as modern debuggers can identify enum constants and list them accordingly.
>
> This is a much better selling point for why such a change would be
> desirable. Unfortunately, though, the real situation is more
> complicated. The stated argument is only true if these enum values are
> assigned to variables of the enum type. However, this patch only
> defines the new enumeration type but never actually uses it to declare
> variables, so the benefit for the debugger is never seen. For
> instance, this patch defines:
>
> enum binary_type_deflated {
> BINARY_DELTA_DEFLATED = 1,
> BINARY_LITERAL_DEFLATED
> };
>
> but then the code only ever assigns the enum value to an 'int' variable:
>
> int patch_method;
> ...
> patch_method = BINARY_DELTA_DEFLATED;
>
> at which point the enum value's type is lost; it's an `int` and that's
> how the debugger sees it, just as an `int`, so the debugger
> can't/won't show it as an actual enum value.This is something that I missed, but shouldn't have. I will change the type of the variable to enum and run the tests again, as you have mentioned.
Show 6 quoted lines
> > To fix this, the patch would need to change the variable declaration, as well: > > enum binary_type_deflated enum binary_type_deflated; > > Finally, please wrap the commit message so it fits in 72 columns.
I am really sorry for this error, I was looking to be more descriptive in the commit message, but it does seem unnecessary to be this verbose.
Show 11 quoted lines
> > > Signed-off-by: Vinayak Dev <vinayakdev.sci@gmail.com> > > > > vinayakdsci (1): > > Change #define to enum in apply.c and alias.c > > There should be a "---" line just below your sign-off to tell git-am > where the patch's commit message ends, but the "---" line is missing > for some reason. If you didn't remove the "---" line manually, then > you may need to adjust your patch-sending tool to not strip it out. >
I will correct this error in further patches, it looks like I did remove it erroneously.
Show 19 quoted lines
> > diff --git a/alias.c b/alias.c
> > @@ -44,9 +44,15 @@ void list_aliases(struct string_list *list)
> > -#define SPLIT_CMDLINE_BAD_ENDING 1
> > -#define SPLIT_CMDLINE_UNCLOSED_QUOTE 2
> > -#define SPLIT_CMDLINE_ARGC_OVERFLOW 3
> > +/* #define SPLIT_CMDLINE_BAD_ENDING 1 */
> > +/* #define SPLIT_CMDLINE_UNCLOSED_QUOTE 2 */
> > +/* #define SPLIT_CMDLINE_ARGC_OVERFLOW 3 */
> > +enum split_cmdline_error {
> > + SPLIT_CMDLINE_BAD_ENDING = 1,
> > + SPLIT_CMDLINE_UNCLOSED_QUOTE,
> > + SPLIT_CMDLINE_ARGC_OVERFLOW
> > +};
>
> Retaining the #define lines as comments serves no purpose once you
> have introduced the enum. It's confusing for readers, and there is a
> good chance that the commented-out #defines and enum values will drift
> out of sync over time.
>I did not remove them in fear of making a mistake in the enum fields(rookie mistake), but I should have removed them, your point is absolutely valid.
Show 19 quoted lines
> If we look at the code which utilizes these values, we see several > instances like this: > > return -SPLIT_CMDLINE_BAD_ENDING; > > which means that the value being returned from the function is not a > valid enum value since it has been negated. Thus, in this case, > converting the #defines to an enum makes the code less valid and less > clear. Moreover, these constants are only used in `return` statements > from the function, are always negated, and are always returned as the > exit code of the program itself; they are never stored in variables. > Thus, the debugger-related benefit mentioned in the commit message can > never materialize. > > So, all in all, I'd say that this is one of those unfortunate cases in > which conversion from #define to enum is unwanted since it makes the > code less clear and less valid, and provides no benefit. If you reroll > the patch, I'd suggest dropping these modifications to "alias.c". >
OK, I will do so. These technical specifications related to changes in alias.c are things that I did study about in C, but never actually saw them in practice, so I guess I just lowered my guard for such mistakes.
Further, I will change variable types from int to enum in apply.c, which, as you correctly point out, are still integers. I will amend these mistakes in further patches.
Thanks a lot! Vinayak