~ 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