--- /home/jfw/build/Scheme/chicken-core/runtime.c 2011-10-14 18:24:28.000000000 +0200 +++ runtime.c 2011-10-21 14:38:42.269533964 +0200 @@ -1790,10 +1790,20 @@ return C_restore; } +C_inline C_regparm int C_i_in_stackp(C_word x) +{ + C_word *ptr = (C_word *)(C_uword)x; + +#if C_STACK_GROWS_DOWNWARD + return ptr >= C_stack_pointer_test && ptr <= stack_bottom; +#else + return ptr < C_stack_pointer_test && ptr >= stack_bottom; +#endif +} void C_fcall C_callback_adjust_stack(C_word *a, int size) { - if(!chicken_is_running && !C_in_stackp((C_word)a)) { + if(!chicken_is_running && !C_i_in_stackp((C_word)a)) { if(debug_mode) C_dbg(C_text("debug"), C_text("callback invoked in lower stack region - adjusting limits:\n" @@ -1968,7 +1978,7 @@ key = hash_string(len, str, stable->size); if(C_truep(s = lookup(key, len, str, stable))) { - if(C_in_stackp(s)) C_mutate(slot, s); + if(C_i_in_stackp(s)) C_mutate(slot, s); return s; } @@ -2109,19 +2119,11 @@ return sym; } - C_regparm int C_in_stackp(C_word x) { - C_word *ptr = (C_word *)(C_uword)x; - -#if C_STACK_GROWS_DOWNWARD - return ptr >= C_stack_pointer_test && ptr <= stack_bottom; -#else - return ptr < C_stack_pointer_test && ptr >= stack_bottom; -#endif + return C_i_in_stackp(x); } - C_regparm int C_fcall C_in_heapp(C_word x) { C_byte *ptr = (C_byte *)(C_uword)x; @@ -2569,7 +2571,7 @@ while(n--) { x = va_arg(v, C_word); - if(C_in_stackp(x)) C_mutate(p++, x); + if(C_i_in_stackp(x)) C_mutate(p++, x); else *(p++) = x; } @@ -2593,7 +2595,7 @@ while(n--) { x = va_arg(v, C_word); - if(C_in_stackp(x)) C_mutate(p++, x); + if(C_i_in_stackp(x)) C_mutate(p++, x); else *(p++) = x; } @@ -2670,7 +2672,7 @@ C_uword count, bytes; C_word *p, **msp, bucket, last, item, container; C_header h; - C_byte *tmp, *start; + C_byte *tmp, *start = C_fromspace_top; LF_LIST *lfn; C_SCHEME_BLOCK *bp; C_GC_ROOT *gcrp; @@ -2696,7 +2698,7 @@ gc_mode = GC_MINOR; /* Entry point for second-level GC (on explicit request or because of full fromspace): */ - if(C_setjmp(gc_restart) || (start = C_fromspace_top) >= C_fromspace_limit) { + if(C_setjmp(gc_restart) || start >= C_fromspace_limit) { if(gc_bell) { C_putchar(7); C_fflush(stdout); @@ -3424,7 +3426,7 @@ if(is_fptr(h)) /* forwarded? update l-table entry */ loc = locative_table[ i ] = fptr_to_ptr(h); /* otherwise it must have been GC'd (since this is a minor one) */ - else if(C_in_stackp(loc)) { + else if(C_i_in_stackp(loc)) { locative_table[ i ] = C_SCHEME_UNDEFINED; C_set_block_item(loc, 0, 0); ++invalidated; @@ -3441,7 +3443,7 @@ C_set_block_item(loc, 0, (C_uword)fptr_to_ptr(h) + offset); hi = i + 1; } - else if(C_in_stackp(obj)) { /* pointed-at object GC'd, locative is invalid */ + else if(C_i_in_stackp(obj)) { /* pointed-at object GC'd, locative is invalid */ locative_table[ i ] = C_SCHEME_UNDEFINED; C_set_block_item(loc, 0, 0); } @@ -5025,7 +5027,8 @@ if(C_immediatep(x) || C_block_header(x) != C_PAIR_TAG) barf(C_BAD_ARGUMENT_TYPE_ERROR, "set-car!", x); - C_mutate(&C_u_i_car(x), val); + if(!C_immediatep(val) && C_i_in_stackp(val)) C_mutate(&C_u_i_car(x), val); + else C_u_i_car(x) = val; return C_SCHEME_UNDEFINED; } @@ -5035,7 +5038,8 @@ if(C_immediatep(x) || C_block_header(x) != C_PAIR_TAG) barf(C_BAD_ARGUMENT_TYPE_ERROR, "set-cdr!", x); - C_mutate(&C_u_i_cdr(x), val); + if(!C_immediatep(val) && C_i_in_stackp(val)) C_mutate(&C_u_i_cdr(x), val); + else C_u_i_cdr(x) = val; return C_SCHEME_UNDEFINED; } @@ -5052,7 +5056,8 @@ if(j < 0 || j >= C_header_size(v)) barf(C_OUT_OF_RANGE_ERROR, "vector-set!", v, i); - C_mutate(&C_block_item(v, j), x); + if(!C_immediatep(x) && C_i_in_stackp(x)) C_mutate(&C_block_item(v, j), x); + else C_block_item(v, j) = x; } else barf(C_BAD_ARGUMENT_TYPE_ERROR, "vector-set!", i); @@ -6970,6 +6975,8 @@ if(c == 3) { arg = va_arg(v, C_word); f = C_truep(arg); + if((arg & C_FIXNUM_BIT) != 0) size = C_unfix(arg); + else if(arg == C_SCHEME_END_OF_LIST) size = percentage(heap_size, C_heap_growth); } else if(c != 2) C_bad_min_argc(c, 2); else f = 1; @@ -6977,11 +6984,6 @@ C_save(k); va_end(v); - if(c == 3) { - if((arg & C_FIXNUM_BIT) != 0) size = C_unfix(arg); - else if(arg == C_SCHEME_END_OF_LIST) size = percentage(heap_size, C_heap_growth); - } - if(size && !C_heap_size_is_fixed) { C_rereclaim2(size, 0); gc_2(NULL); @@ -8073,10 +8075,10 @@ flist->next = finalizer_list; finalizer_list = flist; - if(C_in_stackp(x)) C_mutate(&flist->item, x); + if(C_i_in_stackp(x)) C_mutate(&flist->item, x); else flist->item = x; - if(C_in_stackp(proc)) C_mutate(&flist->finalizer, proc); + if(C_i_in_stackp(proc)) C_mutate(&flist->finalizer, proc); else flist->finalizer = proc; ++live_finalizer_count;