summaryrefslogtreecommitdiff
path: root/allchblk.c
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2023-01-20 23:48:21 +0300
committerIvan Maidanski <ivmai@mail.ru>2023-01-24 11:38:44 +0300
commit564274514901f43f9b2e308c96ac8b835026a35d (patch)
treebb9b67c45316ce83acfcb7c2006bb293f3d34e8d /allchblk.c
parent9d00bac77558d340d2af1dfbe37829cc16667a06 (diff)
downloadbdwgc-564274514901f43f9b2e308c96ac8b835026a35d.tar.gz
Check highest bit of word using SIGNB instead of cast to signed_word
(refactoring) * allchblk.c (GC_merge_unmapped): Replace overflow check (signed_word)(sz1+sz2)>0 to !((sz1+sz2)&SIGNB). * allchblk.c (GC_freehblk): Likewise. * mark.c (GC_mark_from): Replace (signed_word)descr>=0 expression to !(descr&SIGNB). * ptr_chck.c (GC_is_visible): Likewise.
Diffstat (limited to 'allchblk.c')
-rw-r--r--allchblk.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/allchblk.c b/allchblk.c
index 85bb9d4e..0b9df79e 100644
--- a/allchblk.c
+++ b/allchblk.c
@@ -537,9 +537,9 @@ GC_INNER void GC_merge_unmapped(void)
next = (struct hblk *)((word)h + size);
GET_HDR(next, nexthdr);
/* Coalesce with successor, if possible */
- if (0 != nexthdr && HBLK_IS_FREE(nexthdr)
- && (signed_word) (size + (nextsize = nexthdr->hb_sz)) > 0
- /* no pot. overflow */) {
+ if (nexthdr != NULL && HBLK_IS_FREE(nexthdr)
+ && !((size + (nextsize = nexthdr -> hb_sz)) & SIGNB)
+ /* no overflow */) {
/* Note that we usually try to avoid adjacent free blocks */
/* that are either both mapped or both unmapped. But that */
/* isn't guaranteed to hold since we remap blocks when we */
@@ -990,8 +990,7 @@ GC_INNER void GC_freehblk(struct hblk *hbp)
prev = GC_free_block_ending_at(hbp);
/* Coalesce with successor, if possible */
if (nexthdr != NULL && HBLK_IS_FREE(nexthdr) && IS_MAPPED(nexthdr)
- && (signed_word)(hhdr -> hb_sz + nexthdr -> hb_sz) > 0
- /* no overflow */) {
+ && !((hhdr -> hb_sz + nexthdr -> hb_sz) & SIGNB) /* no overflow */) {
GC_remove_from_fl(nexthdr);
hhdr -> hb_sz += nexthdr -> hb_sz;
GC_remove_header(next);
@@ -1000,7 +999,7 @@ GC_INNER void GC_freehblk(struct hblk *hbp)
if (prev /* != NULL */) { /* CPPCHECK */
prevhdr = HDR(prev);
if (IS_MAPPED(prevhdr)
- && (signed_word)(hhdr -> hb_sz + prevhdr -> hb_sz) > 0) {
+ && !((hhdr -> hb_sz + prevhdr -> hb_sz) & SIGNB)) {
GC_remove_from_fl(prevhdr);
prevhdr -> hb_sz += hhdr -> hb_sz;
# ifdef USE_MUNMAP