> It won't go in cleanly any more:

How about the below patch?

Mike Lambert


Index: stacks.c
===================================================================
RCS file: /cvs/public/parrot/stacks.c,v
retrieving revision 1.26
diff -u -r1.26 stacks.c
--- stacks.c    29 Mar 2002 20:14:42 -0000      1.26
+++ stacks.c    30 Mar 2002 01:15:31 -0000
@@ -149,7 +149,21 @@
            void *thing, Stack_entry_type type, Stack_cleanup_method
cleanup)
 {
     Stack_chunk *chunk = stack_base->prev;
-    Stack_entry *entry = &chunk->entry[chunk->used];
+    Stack_entry *entry;
+
+    /* Do we need a new chunk? */
+    if (chunk->used == STACK_CHUNK_DEPTH) {
+        /* Need to add a new chunk */
+        Stack_chunk *new_chunk = mem_allocate_aligned(sizeof(Stack_chunk));
+        new_chunk->used = 0;
+        new_chunk->next = stack_base;
+        new_chunk->prev = chunk;
+        chunk->next = new_chunk;
+        stack_base->prev = new_chunk;
+        chunk = new_chunk;
+    }
+
+    entry = &chunk->entry[chunk->used];

     /* Remember the type */
     entry->entry_type = type;
@@ -184,17 +198,8 @@
                                "Invalid stack_entry_type!\n");
             break;
     }
-
-    /* Register the new entry */
-    if (++chunk->used == STACK_CHUNK_DEPTH) {
-        /* Need to add a new chunk */
-        Stack_chunk *new_chunk = mem_allocate_aligned(sizeof(Stack_chunk));
-        new_chunk->used  = 0;
-        new_chunk->next  = stack_base;
-        new_chunk->prev  = chunk;
-        chunk->next      = new_chunk;
-        stack_base->prev = new_chunk;
-    }
+
+    chunk->used++;
 }

 /* Pop off an entry and return a pointer to the contents */
@@ -222,7 +227,10 @@
         internal_exception(ERROR_STACK_EMPTY, "No entries on stack!\n");
     }

-    entry = &chunk->entry[chunk->used - 1];
+    /* Now decrement the SP */
+    chunk->used--;
+
+    entry = &chunk->entry[chunk->used];

     /* Types of 0 mean we don't care */
     if (type && entry->entry_type != type) {
@@ -234,9 +242,6 @@
     if (entry->flags & STACK_ENTRY_CLEANUP_FLAG) {
         (*entry->cleanup)(entry);
     }
-
-    /* Now decrement the SP */
-    chunk->used--;

     /* Sometimes the caller doesn't care what the value was */
     if (where == NULL) {




Reply via email to