~ chicken-core (chicken-5) 4b6fe237ef16cacab1d1388ed47e492d4eba3dbd
commit 4b6fe237ef16cacab1d1388ed47e492d4eba3dbd Author: felix <felix@call-with-current-continuation.org> AuthorDate: Mon Jul 20 22:52:22 2015 +0200 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Mon Jul 20 22:52:22 2015 +0200 bugfixes in C_make_structure(_2) diff --git a/runtime.c b/runtime.c index f5e8b86b..a8bed6cf 100644 --- a/runtime.c +++ b/runtime.c @@ -7803,26 +7803,13 @@ void C_ccall C_fixnum_to_string(C_word c, C_word *av) void C_ccall C_make_structure(C_word c, C_word *av) { - C_word - /* closure = av[ 0 ] */ - k = av[ 1 ], - type = av[ 2 ], - *p; - int i; - - av += 2; - - for(i = c - 3; i--; C_save(*(av++))); - - C_save(type); - C_save(k); - - if(!C_demand(c - 1)) - C_reclaim((void *)make_structure_2, c); + if(!C_demand(c - 1)) { + C_temporary_stack = C_temporary_stack_bottom - (c - 1); + C_memcpy(C_temporary_stack, av + 1, (c - 1) * sizeof(C_word)); + C_reclaim((void *)make_structure_2, c - 1); + } - p = C_temporary_stack; - C_temporary_stack = C_temporary_stack_bottom; - make_structure_2(0, p); + make_structure_2(c - 1, av + 1); } @@ -7838,11 +7825,10 @@ void C_ccall make_structure_2(C_word c, C_word *av) *(s++) = C_STRUCTURE_TYPE | (size + 1); *(s++) = type; - s += size; av += 2; while(size--) - *(--s) = *(av++); + *(s++) = *(av++); C_kontinue(k, s0); }Trap