~ 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