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;