~ chicken-core (chicken-5) e358c8861ef943c26771ae0a8137e6fc02b14a77


commit e358c8861ef943c26771ae0a8137e6fc02b14a77
Author:     Peter Bex <peter@more-magic.net>
AuthorDate: Thu Oct 1 17:03:21 2015 +0200
Commit:     Evan Hanson <evhan@foldling.org>
CommitDate: Mon Oct 5 09:54:59 2015 +1300

    Simplify C_make_structure by using standard save_and_reclaim
    
    This gets rid of the extra make_structure_2 function which doesn't
    really add anything except make the code less clear & more confusing.
    
    Signed-off-by: Evan Hanson <evhan@foldling.org>

diff --git a/runtime.c b/runtime.c
index 22648fef..9a8e6b4f 100644
--- a/runtime.c
+++ b/runtime.c
@@ -551,7 +551,6 @@ static C_cpsproc(call_cc_wrapper) C_noret;
 static C_cpsproc(call_cc_values_wrapper) C_noret;
 static C_cpsproc(gc_2) C_noret;
 static C_cpsproc(allocate_vector_2) C_noret;
-static C_cpsproc(make_structure_2) C_noret;
 static C_cpsproc(generic_trampoline) C_noret;
 static void handle_interrupt(void *trampoline) C_noret;
 static C_cpsproc(callback_return_continuation) C_noret;
@@ -11362,31 +11361,22 @@ static void bignum_to_str_2(C_word c, C_word *av)
 
 
 void C_ccall C_make_structure(C_word c, C_word *av)
-{
-  if(!C_demand(c - 1)) {
-    assert(C_temporary_stack == C_temporary_stack_bottom);
-    C_temporary_stack = C_temporary_stack_bottom - (c - 1);
-    C_memmove(C_temporary_stack, av + 1, (c - 1) * sizeof(C_word));
-    C_reclaim((void *)make_structure_2, c - 1);
-  }
-
-  make_structure_2(c - 1, av + 1);
-}
-
-
-void C_ccall make_structure_2(C_word c, C_word *av)
 {
   C_word
-    k = av[ 0 ],
-    type = av[ 1 ],
-    size = c - 2,
-    *a = C_alloc(C_SIZEOF_STRUCTURE(size+1)),
-    *s = a,
-    s0 = (C_word)s;
+    /* closure = av[ 0 ] */
+    k = av[ 1 ],
+    type = av[ 2 ],
+    size = c - 3,
+    *s, s0;
 
+  if(!C_demand(size + 2))
+    C_save_and_reclaim((void *)C_make_structure, c, av);
+
+  s = C_alloc(C_SIZEOF_STRUCTURE(size + 1)),
+  s0 = (C_word)s;
   *(s++) = C_STRUCTURE_TYPE | (size + 1);
   *(s++) = type;
-  av += 2;
+  av += 3;
 
   while(size--)
     *(s++) = *(av++);
Trap