~ chicken-core (chicken-5) da93a243ef1c21c5ffeec4b791d797da61075611
commit da93a243ef1c21c5ffeec4b791d797da61075611 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Thu Jul 16 13:14:26 2015 +0200 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Thu Jul 16 13:14:26 2015 +0200 restore C_temporary_stack, where necessary diff --git a/runtime.c b/runtime.c index 1138c24f..3dc24c9e 100644 --- a/runtime.c +++ b/runtime.c @@ -1898,7 +1898,9 @@ C_word C_fcall C_callback(C_word closure, int argc) av = C_alloc(argc + 2); av[ 0 ] = closure; av[ 1 ] = k; + /*XXX is the order of arguments an issue? */ C_memcpy(av + 2, C_temporary_stack, (argc - 2) * sizeof(C_word)); + C_temporary_stack = C_temporary_stack_bottom; #ifdef HAVE_SIGSETJMP if(!C_sigsetjmp(C_restart, 0)) C_do_apply(argc, av); @@ -1908,8 +1910,12 @@ C_word C_fcall C_callback(C_word closure, int argc) serious_signal_occurred = 0; - if(!callback_returned_flag) - ((C_proc)C_restart_trampoline)(C_restart_c, C_temporary_stack); + if(!callback_returned_flag) { + C_word *p = C_temporary_stack; + + C_temporary_stack = C_temporary_stack_bottom; + ((C_proc)C_restart_trampoline)(C_restart_c, p); + } else { C_memcpy(&C_restart, &prev, sizeof(C_restart)); callback_returned_flag = 0; @@ -2697,8 +2703,8 @@ C_mutate_slot(C_word *slot, C_word val) void C_save_and_reclaim(void *trampoline, int n, C_word *av) { if(C_temporary_stack != av) { /* used in apply */ - C_temporary_stack -= n; - memcpy(C_temporary_stack, av, n * sizeof(C_word)); + C_temporary_stack = C_temporary_stack_bottom - n; + C_memcpy(C_temporary_stack, av, n * sizeof(C_word)); } C_reclaim(trampoline, n); @@ -5979,6 +5985,7 @@ void C_ccall C_apply(C_word c, C_word *av) ++m; } + C_temporary_stack = C_temporary_stack_bottom; ((C_proc)(void *)C_block_item(fn, 0))(m + 1, C_temporary_stack_limit); }Trap