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;
