~ chicken-core (chicken-5) d310dc22833d4f45cfa209a4f58bb23ebb39a1c0


commit d310dc22833d4f45cfa209a4f58bb23ebb39a1c0
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Wed Jul 15 12:32:27 2015 +0200
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Wed Jul 15 12:32:27 2015 +0200

    csi starts

diff --git a/chicken.h b/chicken.h
index 0f9925ac..f05ae42d 100644
--- a/chicken.h
+++ b/chicken.h
@@ -1961,7 +1961,7 @@ C_fctexport  int  CHICKEN_eval_string(char * str,C_word *result);
 C_fctexport  int  CHICKEN_eval(C_word exp,C_word *result);
 C_fctexport  int  CHICKEN_yield();
 
-C_fctexport void C_default_5fstub_toplevel(C_word c,C_word d,C_word k) C_noret;
+C_fctexport C_cpsproc(C_default_5fstub_toplevel);
 
 
 /* Inline functions: */
diff --git a/runtime.c b/runtime.c
index 147565cc..1138c24f 100644
--- a/runtime.c
+++ b/runtime.c
@@ -510,7 +510,7 @@ static C_cpsproc(sigbus_trampoline) C_noret;
 static C_PTABLE_ENTRY *create_initial_ptable();
 
 #if !defined(NO_DLOAD2) && (defined(HAVE_DLFCN_H) || defined(HAVE_DL_H) || (defined(HAVE_LOADLIBRARY) && defined(HAVE_GETPROCADDRESS)))
-static void dload_2(void *dummy) C_noret;
+static void C_ccall dload_2(C_word, C_word *) C_noret;
 #endif
 
 
@@ -6013,13 +6013,13 @@ void C_ccall call_cc_wrapper(C_word c, C_word *av)
 {
   C_word
     closure = av[ 0 ],
-    /* av[ 1 ] is k and ignored */
+    /* av[ 1 ] is current k and ignored */
     result = av[ 2 ],
-    cont = C_block_item(closure,1);
+    k = C_block_item(closure, 1);
 
   if(c != 3) C_bad_argc(c, 3);
 
-  C_kontinue(cont, result);
+  C_kontinue(k, result);
 }
 
 
@@ -6027,16 +6027,14 @@ void C_ccall call_cc_values_wrapper(C_word c, C_word *av)
 {
   C_word
     closure = av[ 0 ],
-    cont = C_block_item(closure,1),
+    /* av[ 1 ] is current k and ignored */
+    k = C_block_item(closure, 1),
     x1,
     n = c;
   
-  av[ 0 ] = cont;               /* reuse av */
-
-  if(c > 2) --n;
-  else av[ 1 ] = C_SCHEME_UNBOUND;
-
-  C_do_apply(n - 2, av);
+  av[ 0 ] = k;               /* reuse av */
+  C_memmove(av + 1, av + 2, (n - 1) * sizeof(C_word));
+  C_do_apply(n - 1, av);
 }
 
 
@@ -6067,8 +6065,8 @@ void C_ccall C_values(C_word c, C_word *av)
   /* Check continuation whether it receives multiple values: */
   if(C_block_item(k, 0) == (C_word)values_continuation) {
     av[ 0 ] = k;                /* reuse av */
-    av[ 1 ] = C_SCHEME_UNBOUND; /* unbound value marks direct invocation */
-    C_do_apply(n - 2, av);
+    C_memmove(av + 2, av + 1, (c - 1) * sizeof(C_word));
+    C_do_apply(c - 1, av);
   }
   
   if(c != 3) {
@@ -6098,17 +6096,17 @@ void C_ccall C_apply_values(C_word c, C_word *av)
   /* Check continuation wether it receives multiple values: */
   if(C_block_item(k, 0) == (C_word)values_continuation) {
     C_word *av2;
+    C_word *ptr = C_temporary_stack_limit;
 
     for(n = 0; !C_immediatep(lst) && C_block_header(lst) == C_PAIR_TAG; ++n) {
-      C_save(C_u_i_car(lst));
+      *(ptr++) = C_u_i_car(lst);
       lst = C_u_i_cdr(lst);
     }
 
     /* copy into new array */
-    av2 = C_alloc(n + 2);
+    av2 = C_alloc(n + 1);
     av2[ 0 ] = k;
-    av2[ 1 ] = C_SCHEME_UNBOUND; /* unbound value marks direct invocation */
-    C_memcpy(av2 + 2, C_temporary_stack, n * sizeof(C_word));
+    C_memcpy(av2 + 1, C_temporary_stack_limit, n * sizeof(C_word));
     C_do_apply(n, av2);
   }
   
@@ -6147,7 +6145,7 @@ void C_ccall C_call_with_values(C_word c, C_word *av)
   kk = C_closure(&a, 3, (C_word)values_continuation, kont, k);
   av[ 0 ] = thunk;              /* reuse av */
   av[ 1 ] = kk;
-  C_do_apply(0, av);
+  C_do_apply(2, av);
 }
 
 
@@ -6164,7 +6162,7 @@ void C_ccall C_u_call_with_values(C_word c, C_word *av)
   kk = C_closure(&a, 3, (C_word)values_continuation, kont, k);
   av[ 0 ] = thunk;              /* reuse av */
   av[ 1 ] = kk;
-  C_do_apply(0, av);
+  C_do_apply(2, av);
 }
 
 
@@ -6174,25 +6172,12 @@ void C_ccall values_continuation(C_word c, C_word *av)
     closure = av[ 0 ],
     kont = C_block_item(closure, 1),
     k = C_block_item(closure, 2),
-    n = c,
-    arg0 = av[ 1 ],
-    *av2;
-
-  if(arg0 == C_SCHEME_UNBOUND) { /* This continuation was called by 'values'... */
-    av[ 0 ] = kont;              /* reuse av */
-    av[ 1 ] = k;
-    av2 = av;
-  }
-  else {			/* This continuation was captured and called explicity... */
-    av2 = C_alloc(n + 2);
-    ++n;
-    --c;
-    av2[ 0 ] = kont;
-    av2[ 1 ] = k;
-    C_memcpy(av2 + 2, av + 2, (n - 2) * sizeof(C_word));
-  }
+    *av2 = C_alloc(c + 1);
 
-  C_do_apply(n - 2, av2);
+  av2[ 0 ] = kont;
+  av2[ 1 ] = k;
+  C_memcpy(av2 + 2, av + 1, (c - 1) * sizeof(C_word));
+  C_do_apply(c + 1, av2);
 }
 
 
@@ -8237,7 +8222,7 @@ void C_ccall C_dload(C_word c, C_word *av)
 #if !defined(NO_DLOAD2) && defined(HAVE_DL_H) && !defined(DLOAD_2_DEFINED)
 # ifdef __hpux__
 #  define DLOAD_2_DEFINED
-void dload_2(void *dummy)
+void C_ccall dload_2(C_word c, C_word *av0)
 {
   void *handle, *p;
   C_word
@@ -8289,7 +8274,7 @@ void dload_2(void *dummy)
 #if !defined(NO_DLOAD2) && defined(HAVE_DLFCN_H) && !defined(DLOAD_2_DEFINED)
 # ifndef __hpux__
 #  define DLOAD_2_DEFINED
-void dload_2(void *dummy)
+void C_ccall dload_2(C_word c, C_word *av0)
 {
   void *handle, *p, *p2;
   C_word 
@@ -8327,7 +8312,7 @@ void dload_2(void *dummy)
 
       av[ 0 ] = C_SCHEME_UNDEFINED;
       av[ 1 ] = k;
-      ((C_proc)p)(2, *av); /* doesn't return */
+      ((C_proc)p)(2, av); /* doesn't return */
     }
 
     C_dlclose(handle);
@@ -8342,7 +8327,7 @@ void dload_2(void *dummy)
 
 #if !defined(NO_DLOAD2) && (defined(HAVE_LOADLIBRARY) && defined(HAVE_GETPROCADDRESS)) && !defined(DLOAD_2_DEFINED)
 # define DLOAD_2_DEFINED
-void dload_2(void *dummy)
+void C_ccall dload_2(C_word c, C_word *av0)
 {
   HINSTANCE handle;
   FARPROC p = NULL, p2;
Trap