summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Valentine-House <matt@eightbitraptor.com>2026-02-03 14:39:48 -0500
committerMatt Valentine-House <matt@eightbitraptor.com>2026-02-13 14:29:14 +0000
commit1b65282961de25380d4c6e34d249136d0ea1fa5c (patch)
tree6c47a13c69dc70dda1c154f9e868b1342d535e5c
parent5c71c8c55bd71cff64e670097e4800d9e3d67ae4 (diff)
hardcode and look up magic numbers
instead of computing them on page add
-rw-r--r--gc/default/default.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/gc/default/default.c b/gc/default/default.c
index c766521108..8fa030cadc 100644
--- a/gc/default/default.c
+++ b/gc/default/default.c
@@ -841,11 +841,13 @@ heap_page_in_global_empty_pages_pool(rb_objspace_t *objspace, struct heap_page *
#define GET_PAGE_HEADER(x) (&GET_PAGE_BODY(x)->header)
#define GET_HEAP_PAGE(x) (GET_PAGE_HEADER(x)->page)
-static inline uint32_t
-compute_slot_div_magic(unsigned short slot_size)
-{
- return (uint32_t)(UINT32_MAX / slot_size) + 1;
-}
+static const uint32_t slot_div_magics[HEAP_COUNT] = {
+ 0x06666667U,
+ 0x03333334U,
+ 0x0199999aU,
+ 0x00cccccdU,
+ 0x00666667U,
+};
static inline size_t
slot_index_for_offset(size_t offset, uint32_t div_magic)
@@ -2006,7 +2008,7 @@ heap_add_page(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *page)
page->start = start;
page->total_slots = slot_count;
page->slot_size = heap->slot_size;
- page->slot_div_magic = compute_slot_div_magic(heap->slot_size);
+ page->slot_div_magic = slot_div_magics[heap - heaps];
page->heap = heap;
asan_unlock_freelist(page);