builtin/blame.c: bit field constants into bit shift format
cover builtin/blame.c: bit field constants into bit shift format
we are looking at bitfield constants, and elsewhere in the Git source code, such cases are handled via bit shift operators rather than octal numbers, which also makes it easier to spot holes in the range (if, say, 1<<5 was missing, it is easier to spot it between 1<<4 and 1<<6 than it is to spot a missing 040 between a 020 and a 0100). Also, bit shifts lead to low-level optimizations because they require fewer calculations for the CPU.
Special Thanks to @dscho for helping me out throughout the process.
Hariom Verma (1):
builtin/blame.c: constants into bit shift format
builtin/blame.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)
base-commit: 08da6496b61341ec45eac36afcc8f94242763468
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-382%2Fharry-hov%2Fenum-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-382/harry-hov/enum-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/382
Signature · 1 line
gitgitgadget
PATCH 1/1 builtin/blame.c: constants into bit shift format
From: Hariom Verma <[email protected]>
We are looking at bitfield constants, and elsewhere in the Git source code, such cases are handled via bit shift operators rather than octal numbers, which also makes it easier to spot holes in the range (if, say, 1<<5 was missing, it is easier to spot it between 1<<4 and 1<<6 than it is to spot a missing 040 between a 020 and a 0100).
--- builtin/blame.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)
builtin/blame.c +12 -12
@@ -319,18 +319,18 @@ static const char *format_time(timestamp_t time, const char *tz_str,return time_buf.buf; } -#define OUTPUT_ANNOTATE_COMPAT 001 -#define OUTPUT_LONG_OBJECT_NAME 002 -#define OUTPUT_RAW_TIMESTAMP 004 -#define OUTPUT_PORCELAIN 010 -#define OUTPUT_SHOW_NAME 020 -#define OUTPUT_SHOW_NUMBER 040 -#define OUTPUT_SHOW_SCORE 0100 -#define OUTPUT_NO_AUTHOR 0200 -#define OUTPUT_SHOW_EMAIL 0400 -#define OUTPUT_LINE_PORCELAIN 01000 -#define OUTPUT_COLOR_LINE 02000 -#define OUTPUT_SHOW_AGE_WITH_COLOR 04000 +#define OUTPUT_ANNOTATE_COMPAT (1<<0) +#define OUTPUT_LONG_OBJECT_NAME (1<<1) +#define OUTPUT_RAW_TIMESTAMP (1<<2) +#define OUTPUT_PORCELAIN (1<<3) +#define OUTPUT_SHOW_NAME (1<<4) +#define OUTPUT_SHOW_NUMBER (1<<5) +#define OUTPUT_SHOW_SCORE (1<<6) +#define OUTPUT_NO_AUTHOR (1<<7) +#define OUTPUT_SHOW_EMAIL (1<<8) +#define OUTPUT_LINE_PORCELAIN (1<<9) +#define OUTPUT_COLOR_LINE (1<<10) +#define OUTPUT_SHOW_AGE_WITH_COLOR (1<<11)static void emit_porcelain_details (struct blame_origin *suspect,int repeat) {
Signature · 1 line
gitgitgadget
Re: [PATCH 1/1] builtin/blame.c: constants into bit shift format
Quoted 35 lines · Hariom Verma via GitGitGadget
From: Hariom Verma <[email protected]>
We are looking at bitfield constants, and elsewhere in the Git source code, such cases are handled via bit shift operators rather than octal numbers, which also makes it easier to spot holes in the range (if, say, 1<<5 was missing, it is easier to spot it between 1<<4 and 1<<6 than it is to spot a missing 040 between a 020 and a 0100).
Signed-off-by Hariom Verma <[email protected]>--- builtin/blame.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)builtin/blame.c +2
-12@@ -319,18 +319,18 @@ static const char *format_time(timestamp_t time, const char *tz_str,return time_buf.buf; } -#define OUTPUT_ANNOTATE_COMPAT 001 -#define OUTPUT_LONG_OBJECT_NAME 002 -#define OUTPUT_RAW_TIMESTAMP 004 -#define OUTPUT_PORCELAIN 010 -#define OUTPUT_SHOW_NAME 020 -#define OUTPUT_SHOW_NUMBER 040 -#define OUTPUT_SHOW_SCORE 0100 -#define OUTPUT_NO_AUTHOR 0200 -#define OUTPUT_SHOW_EMAIL 0400 -#define OUTPUT_LINE_PORCELAIN 01000 -#define OUTPUT_COLOR_LINE 02000 -#define OUTPUT_SHOW_AGE_WITH_COLOR 04000 +#define OUTPUT_ANNOTATE_COMPAT (1<<0) +#define OUTPUT_LONG_OBJECT_NAME (1<<1)
builtin/blame.c static const char *format_time(timestamp_t time, const char *tz_str, · line 333
Quoted 10 lines
builtin/blame.c +10
-0+#define OUTPUT_RAW_TIMESTAMP (1<<2) +#define OUTPUT_PORCELAIN (1<<3) +#define OUTPUT_SHOW_NAME (1<<4) +#define OUTPUT_SHOW_NUMBER (1<<5) +#define OUTPUT_SHOW_SCORE (1<<6) +#define OUTPUT_NO_AUTHOR (1<<7) +#define OUTPUT_SHOW_EMAIL (1<<8) +#define OUTPUT_LINE_PORCELAIN (1<<9) +#define OUTPUT_COLOR_LINE (1<<10) +#define OUTPUT_SHOW_AGE_WITH_COLOR (1<<11)
Nitpick: In the code you remove, tabs were used for alignment. Here, you use spaces. Unless there is any specific reason to do it this way, might as well keep the older style.
There was some discussion recently about converting these related #defines to enums [0]. We might consider doing that here.
If you read through that entire thread, you'd see that there were some disagreements about whether using enums for sets of bits is a good idea ([1] and [2]), but it is at least something worth considering while we are on this topic.
FWIW, I think it is a good idea to use an enum here.
builtin/blame.c static const char *format_time(timestamp_t time, const char *tz_str, · line 336
Quoted 3 lines
builtin/blame.c +0
-0static void emit_porcelain_details (struct blame_origin *suspect,int repeat) {
[0] https://public-inbox.org/git/[email protected]/
[1] https://public-inbox.org/git/[email protected]/
[2] https://public-inbox.org/git/[email protected]/
Signature · 2 lines
Regards, Pratyush Yadav
Re: [PATCH 1/1] builtin/blame.c: constants into bit shift format
Quoted 9 lines
There was some discussion recently about converting these related #defines to enums [0]. We might consider doing that here.
If you read through that entire thread, you'd see that there were some disagreements about whether using enums for sets of bits is a good idea ([1] and [2]), but it is at least something worth considering while we are on this topic.
FWIW, I think it is a good idea to use an enum here.
[snip]
Quoted 3 lines
[0] https://public-inbox.org/git/[email protected]/
[1] https://public-inbox.org/git/[email protected]/
[2] https://public-inbox.org/git/[email protected]/
Thanks for the handy references. You know my opinion on bitflags as enums from reading them, but I think that we have already had that discussion and came to a conclusion. So don't use an enum here.
The patch itself looks good, and I also prefer the bit shift format over octal.
Re: [PATCH 1/1] builtin/blame.c: constants into bit shift format
Quoted 12 lines · Jonathan Tan
Quoted 9 lines
There was some discussion recently about converting these related #defines to enums [0]. We might consider doing that here.
If you read through that entire thread, you'd see that there were some disagreements about whether using enums for sets of bits is a good idea ([1] and [2]), but it is at least something worth considering while we are on this topic.
FWIW, I think it is a good idea to use an enum here.
[snip]
Quoted 7 lines
Quoted 3 lines
[0] https://public-inbox.org/git/[email protected]/
[1] https://public-inbox.org/git/[email protected]/
[2] https://public-inbox.org/git/[email protected]/Thanks for the handy references. You know my opinion on bitflags as enums from reading them, but I think that we have already had that discussion and came to a conclusion. So don't use an enum here.
Ah! I missed your last email in that thread that finally settled on avoiding bitsets, and thought the discussion was still ongoing. My bad :)
Quoted 2 lines
The patch itself looks good, and I also prefer the bit shift format over octal.
Signature · 2 lines
Regards, Pratyush Yadav
Re: [PATCH 1/1] builtin/blame.c: constants into bit shift format
In reply to Hariom Verma via GitGitGadgetbuiltin/blame.c static const char *format_time(timestamp_t time, const char *tz_str, · line 333
Quoted 13 lines · Hariom Verma via GitGitGadget
builtin/blame.c +12
-1-#define OUTPUT_SHOW_AGE_WITH_COLOR 04000 +#define OUTPUT_ANNOTATE_COMPAT (1<<0) +#define OUTPUT_LONG_OBJECT_NAME (1<<1) +#define OUTPUT_RAW_TIMESTAMP (1<<2) +#define OUTPUT_PORCELAIN (1<<3) +#define OUTPUT_SHOW_NAME (1<<4) +#define OUTPUT_SHOW_NUMBER (1<<5) +#define OUTPUT_SHOW_SCORE (1<<6) +#define OUTPUT_NO_AUTHOR (1<<7) +#define OUTPUT_SHOW_EMAIL (1<<8) +#define OUTPUT_LINE_PORCELAIN (1<<9) +#define OUTPUT_COLOR_LINE (1<<10) +#define OUTPUT_SHOW_AGE_WITH_COLOR (1<<11)
For these small shift counts it probably would not matter, but it may be a good discipline to make sure they are treated as constants of an unsigned type (i.e. write them as (1U<<0) etc.). It probably starts to matter when you reach 1<<31 if these are bits stuffed into "unsigned int" on 32-bit arch.
One advantage of octal and hexadecimal notations have is that 0x80000000 is automatically unsigned, IIRC, on such an archtecture.
Quoted 6 lines · Hariom Verma via GitGitGadget
we are looking at bitfield constants, and elsewhere in the Git source code, such cases are handled via bit shift operators rather than octal numbers, which also makes it easier to spot holes in the range (if, say, 1<<5 was missing, it is easier to spot it between 1<<4 and 1<<6 than it is to spot a missing 040 between a 020 and a 0100). Also, bit shifts lead to low-level optimizations because they require fewer calculations for the CPU.
I think the last sentence is a nonsense for any decent compiler that turns "1<<5" into 040 at compile time and treats it as literal integer. Luckily, it only appears here in the cover letter and does not appear in the patch proper, so no need to resend the patch to correct this ;-)
v2 cover builtin/blame.c: bit field constants into bit shift format
In reply to Hariom Verma via GitGitGadgetwe are looking at bitfield constants, and elsewhere in the Git source code, such cases are handled via bit shift operators rather than octal numbers, which also makes it easier to spot holes in the range (if, say, 1<<5 was missing, it is easier to spot it between 1<<4 and 1<<6 than it is to spot a missing 040 between a 020 and a 0100). Also, bit shifts lead to low-level optimizations because they require fewer calculations for the CPU.
Special Thanks to @dscho for helping me out throughout the process.
Hariom Verma (1):
builtin/blame.c: constants into bit shift format
builtin/blame.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)
base-commit: 08da6496b61341ec45eac36afcc8f94242763468
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-382%2Fharry-hov%2Fenum-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-382/harry-hov/enum-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/382
Range-diff vs v1:
1: 3b4b8e0353 ! 1: 838478a185 builtin/blame.c: constants into bit shift format
@@ -29,18 +29,18 @@
-#define OUTPUT_LINE_PORCELAIN 01000
-#define OUTPUT_COLOR_LINE 02000
-#define OUTPUT_SHOW_AGE_WITH_COLOR 04000
-+#define OUTPUT_ANNOTATE_COMPAT (1<<0)
-+#define OUTPUT_LONG_OBJECT_NAME (1<<1)
-+#define OUTPUT_RAW_TIMESTAMP (1<<2)
-+#define OUTPUT_PORCELAIN (1<<3)
-+#define OUTPUT_SHOW_NAME (1<<4)
-+#define OUTPUT_SHOW_NUMBER (1<<5)
-+#define OUTPUT_SHOW_SCORE (1<<6)
-+#define OUTPUT_NO_AUTHOR (1<<7)
-+#define OUTPUT_SHOW_EMAIL (1<<8)
-+#define OUTPUT_LINE_PORCELAIN (1<<9)
-+#define OUTPUT_COLOR_LINE (1<<10)
-+#define OUTPUT_SHOW_AGE_WITH_COLOR (1<<11)
++#define OUTPUT_ANNOTATE_COMPAT (1U<<0)
++#define OUTPUT_LONG_OBJECT_NAME (1U<<1)
++#define OUTPUT_RAW_TIMESTAMP (1U<<2)
++#define OUTPUT_PORCELAIN (1U<<3)
++#define OUTPUT_SHOW_NAME (1U<<4)
++#define OUTPUT_SHOW_NUMBER (1U<<5)
++#define OUTPUT_SHOW_SCORE (1U<<6)
++#define OUTPUT_NO_AUTHOR (1U<<7)
++#define OUTPUT_SHOW_EMAIL (1U<<8)
++#define OUTPUT_LINE_PORCELAIN (1U<<9)
++#define OUTPUT_COLOR_LINE (1U<<10)
++#define OUTPUT_SHOW_AGE_WITH_COLOR (1U<<11)
static void emit_porcelain_details(struct blame_origin *suspect, int repeat) {
Signature · 1 line
gitgitgadget
PATCH v2 1/1 builtin/blame.c: constants into bit shift format
From: Hariom Verma <[email protected]>
We are looking at bitfield constants, and elsewhere in the Git source code, such cases are handled via bit shift operators rather than octal numbers, which also makes it easier to spot holes in the range (if, say, 1<<5 was missing, it is easier to spot it between 1<<4 and 1<<6 than it is to spot a missing 040 between a 020 and a 0100).
--- builtin/blame.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)
builtin/blame.c +12 -12
@@ -319,18 +319,18 @@ static const char *format_time(timestamp_t time, const char *tz_str,return time_buf.buf; } -#define OUTPUT_ANNOTATE_COMPAT 001 -#define OUTPUT_LONG_OBJECT_NAME 002 -#define OUTPUT_RAW_TIMESTAMP 004 -#define OUTPUT_PORCELAIN 010 -#define OUTPUT_SHOW_NAME 020 -#define OUTPUT_SHOW_NUMBER 040 -#define OUTPUT_SHOW_SCORE 0100 -#define OUTPUT_NO_AUTHOR 0200 -#define OUTPUT_SHOW_EMAIL 0400 -#define OUTPUT_LINE_PORCELAIN 01000 -#define OUTPUT_COLOR_LINE 02000 -#define OUTPUT_SHOW_AGE_WITH_COLOR 04000 +#define OUTPUT_ANNOTATE_COMPAT (1U<<0) +#define OUTPUT_LONG_OBJECT_NAME (1U<<1) +#define OUTPUT_RAW_TIMESTAMP (1U<<2) +#define OUTPUT_PORCELAIN (1U<<3) +#define OUTPUT_SHOW_NAME (1U<<4) +#define OUTPUT_SHOW_NUMBER (1U<<5) +#define OUTPUT_SHOW_SCORE (1U<<6) +#define OUTPUT_NO_AUTHOR (1U<<7) +#define OUTPUT_SHOW_EMAIL (1U<<8) +#define OUTPUT_LINE_PORCELAIN (1U<<9) +#define OUTPUT_COLOR_LINE (1U<<10) +#define OUTPUT_SHOW_AGE_WITH_COLOR (1U<<11)static void emit_porcelain_details (struct blame_origin *suspect,int repeat) {
Signature · 1 line
gitgitgadget