Jason Gloudon wrote:

ptrdiff_t is not a pointer type, so cur_var_ptr + PARROT_PTR_ALIGNMENT skips
exactly PARROT_PTR_ALIGNMENT bytes.

I did modify your patch slightly
- reversed directions (top->down is probably more common)
- increment by sizeof(void*)

This boost life.pasm gens from 270 -> 330
The I did apply #17495 again: 330 -> 403

WRT the latter: It was considered unsafe to put lo_var_ptr just above the run_loop. I still don't see an example for this.

It could be a src test, which first tests some PMC stuff, the runs an interpreter and finally checks PMCs again.
To be safe, we could do:

if (!interpreter->lo_var_ptr)
interpreter->lo_var_ptr = &lo_var_ptr;

Default is not to set it early, so interpreter->lo_var_ptr would always be near the run loop. This applies of course to all cores.

(All tests still succeed --gc-debug)

leo
--- parrot/ops2cgc.pl   Thu Jul 11 10:25:47 2002
+++ parrot-leo/ops2cgc.pl       Sun Sep 22 18:42:28 2002
@@ -158,6 +158,14 @@
 print SOURCE <<END_C;
   NULL
 };
+/* #ifdef HAVE_NESTED_FUNC */
+    static void _check(void);
+    static void _check(void) {
+       int lo_var_ptr;
+       interpreter->lo_var_ptr = (void*)&lo_var_ptr;
+    }
+    _check();
+/* #endif */
 
 goto *ops_addr[*cur_opcode];
 
--- dod.c       Mon Oct 28 14:58:04 2002
+++ /home/lt/src/parrot-leo/dod.c       Tue Oct 29 16:11:22 2002
@@ -465,7 +465,7 @@
 {
     size_t lo_var_ptr = (size_t)interpreter->lo_var_ptr;
     size_t hi_var_ptr = (size_t)&lo_var_ptr;
-    size_t prefix;
+    size_t prefix, tmp_ptr;
     ptrdiff_t cur_var_ptr;

     size_t buffer_min = get_min_buffer_address(interpreter);
@@ -476,17 +476,20 @@
     size_t mask = find_common_mask(buffer_min < pmc_min ? buffer_min: pmc_min,
                 buffer_max > pmc_max ? buffer_max : pmc_max);

+    if (!lo_var_ptr)
+        return last;
+    if(lo_var_ptr < hi_var_ptr){
+        tmp_ptr = hi_var_ptr;
+        hi_var_ptr = lo_var_ptr;
+        lo_var_ptr = tmp_ptr;
+    }
     /* Get the expected prefix */
     prefix = mask & buffer_min;

-    if (!lo_var_ptr)
-        return last;

-    for (cur_var_ptr = lo_var_ptr;
-        (ptrdiff_t)(cur_var_ptr * PARROT_STACK_DIR) <
-            (ptrdiff_t)(hi_var_ptr * PARROT_STACK_DIR);
-        cur_var_ptr = (size_t)( (ptrdiff_t)cur_var_ptr +
-            PARROT_STACK_DIR * PARROT_PTR_ALIGNMENT )
+    for (cur_var_ptr = hi_var_ptr;
+         (ptrdiff_t)cur_var_ptr < (ptrdiff_t)lo_var_ptr;
+         cur_var_ptr = (size_t)((ptrdiff_t)cur_var_ptr + sizeof(void*))
          ) {
         size_t ptr = *(size_t *)cur_var_ptr;

Reply via email to