This is a clean up attempt.
Passes tests.

Kevin Tew
Index: src/gc/register.c
===================================================================
--- src/gc/register.c	(revision 18297)
+++ src/gc/register.c	(working copy)
@@ -321,6 +321,12 @@
     interp->ctx.bp_ps = old->bp_ps;
 }
 
+
+#define SLOT_CHUNK_SIZE 8
+
+#define CALCULATE_SLOT(all_regs_size) ((all_regs_size + SLOT_CHUNK_SIZE - 1) / SLOT_CHUNK_SIZE)
+#define CALCULATE_ALLOC_SIZE(all_regs_size) (((all_regs_size + SLOT_CHUNK_SIZE - 1) / SLOT_CHUNK_SIZE) * SLOT_CHUNK_SIZE)
+
 struct Parrot_Context *
 Parrot_alloc_context(Interp *interp, INTVAL *n_regs_used)
 {
@@ -331,16 +337,19 @@
      * TODO (OPT) if we allocate a new context due to a self-recursive call
      *      create a specialized version that just uses caller's size
      */
+    const size_t size_i = sizeof (INTVAL)   * n_regs_used[REGNO_INT];
     const size_t size_n = sizeof (FLOATVAL) * n_regs_used[REGNO_NUM];
-    const size_t size_nip = size_n +
-        sizeof (INTVAL) *   n_regs_used[REGNO_INT] +
-        sizeof (PMC*) *     n_regs_used[REGNO_PMC];
-    size_t reg_alloc = size_nip +
-        sizeof (STRING*) *  n_regs_used[REGNO_STR];
+    const size_t size_s = sizeof (STRING*)  * n_regs_used[REGNO_STR];
+    const size_t size_p = sizeof (PMC*)     * n_regs_used[REGNO_PMC];
 
-    const int slot = (reg_alloc + 7) >> 3;
-    reg_alloc = slot << 3;
+    const size_t size_nip = size_n + size_i + size_p;
+    const size_t all_regs_size  = size_n + size_i + size_p + size_s;
 
+    const int slot = CALCULATE_SLOT(all_regs_size);
+    const size_t reg_alloc = CALCULATE_ALLOC_SIZE(all_regs_size);
+
+
+    /* alloc more slots if needed */
     if (slot >= interp->ctx_mem.n_free_slots) {
         const int n = slot + 1;
         int i;
@@ -353,6 +362,7 @@
         interp->ctx_mem.n_free_slots = n;
     }
 
+    /* pop new ctx from free list, else alloc ctx if needed */
     ptr = interp->ctx_mem.free_list[slot];
     old = CONTEXT(interp->ctx);
     if (ptr) {
@@ -365,11 +375,13 @@
         else
             ptr = mem_sys_allocate_zeroed(to_alloc);
     }
+
 #if CTX_LEAK_DEBUG
     if (Interp_debug_TEST(interp, PARROT_CTX_DESTROY_DEBUG_FLAG)) {
         fprintf(stderr, "[alloc ctx %p]\n", ptr);
     }
 #endif
+
     CONTEXT(interp->ctx) = ctx = (struct Parrot_Context *)ptr;
 
     ctx->regs_mem_size   = reg_alloc;
@@ -377,9 +389,9 @@
 
     /* regs start past the context */
     p = (void *) ((char *)ptr + ALIGNED_CTX_SIZE);
-    /* ctx.bp points to I0, which has Nx at left */
+    /* ctx.bp points to I0, which has Nx on the left */
     interp->ctx.bp.regs_i = (INTVAL*)((char*)p + size_n);
-    /* this points to S0 */
+    /* ctx.bp_ps points to S0, which has Px on the left */
     interp->ctx.bp_ps.regs_s = (STRING**)((char*)p + size_nip);
     init_context(interp, ctx, old);
     return ctx;

Reply via email to