diff --git a/chicken.h b/chicken.h index 03138cd..c65eb64 100644 --- a/chicken.h +++ b/chicken.h @@ -1060,7 +1060,7 @@ extern double trunc(double); #define C_header_size(bh) (C_block_header(bh) & C_HEADER_SIZE_MASK) #define C_make_header(type, size) ((C_header)(((type) & C_HEADER_BITS_MASK) | ((size) & C_HEADER_SIZE_MASK))) #define C_symbol_value(x) (C_block_item(x, 0)) -#define C_save(x) (*(--C_temporary_stack) = (C_word)(x)) +#define C_save(x) (C_CHECK(x, (C_temporary_stack > C_temporary_stack_limit), (*(--C_temporary_stack) = (C_word)C_VAL1(x)))) #define C_adjust_stack(n) (C_temporary_stack -= (n)) #define C_rescue(x, i) (C_temporary_stack[ i ] = (x)) #define C_save_rest(s, c, n) do { if((C_temporary_stack - (c - (n))) < C_temporary_stack_limit) C_temp_stack_overflow(); for(va_start(v, s); c-- > (n); C_save(va_arg(v, C_word))); }while(0) diff --git a/runtime.c b/runtime.c index f68cd09..a3583e9 100644 --- a/runtime.c +++ b/runtime.c @@ -6079,10 +6079,10 @@ void C_ccall C_apply(C_word c, C_word closure, C_word k, C_word fn, ...) *(buf++) = x; #else - C_save(x); - - if(C_temporary_stack < C_temporary_stack_limit) + if(C_temporary_stack <= C_temporary_stack_limit) barf(C_TOO_MANY_PARAMETERS_ERROR, "apply"); + + C_save(x); #endif ++n; }