~ chicken-core (chicken-5) 0ecfffadf616b8389216910a35028b4d82021639


commit 0ecfffadf616b8389216910a35028b4d82021639
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Fri Jul 10 23:36:07 2015 +0200
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Fri Jul 10 23:36:07 2015 +0200

    further backend changes

diff --git a/c-backend.scm b/c-backend.scm
index b5d4d0a2..315706c2 100644
--- a/c-backend.scm
+++ b/c-backend.scm
@@ -263,10 +263,16 @@
 			       (gen #t #\t nc #\=)
 			       (expr fn i)
 			       (gen #\;) )
-			     (push-args args i (and (not empty-closure) (string-append "t" (number->string nc))))
-			     (gen #t call-id #\()
-			     (unless customizable (gen nf #\,))
-			     (gen "av);") ) ) )
+			     (cond (customizable
+				    (gen #t call-id #\()
+				    (unless empty-closure (gen #\t nc #\,))
+				    (expr-args args i)
+				    (gen ");") )
+				   (else
+				    (push-args args i (and (not empty-closure) (string-append "t" (number->string nc))))
+				    (gen #t call-id #\()
+				    (unless customizable (gen nf #\,))
+				    (gen "av);") ) ) )))
 		     ((and (eq? '##core#global (node-class fn))
 			   (not unsafe) 
 			   (not no-procedure-checks)
@@ -276,8 +282,7 @@
 			     (safe (second gparams)) 
 			     (block (third gparams)) 
 			     (carg #f))
-			(push-args args i #f)
-			(gen #tr "((C_proc)")
+			(gen #t "C_proc tp=(C_proc)")
 			(cond (no-global-procedure-checks
 			       (set! carg
 				 (if block
@@ -289,8 +294,7 @@
 			       (if safe
 				   (gen "C_fast_retrieve_proc(" carg ")")
 				   (gen "C_retrieve2_symbol_proc(" carg "," 
-					(c-ify-string (##sys#symbol->qualified-string
-						       (fourth gparams))) #\)) ) )
+					(c-ify-string (##sys#symbol->qualified-string (fourth gparams))) #\)) ) )
 			      (safe
 			       (set! carg 
 				 (string-append "*((C_word*)lf[" (number->string index) "]+1)"))
@@ -299,17 +303,19 @@
 			       (set! carg 
 				 (string-append "*((C_word*)lf[" (number->string index) "]+1)"))
 			       (gen "C_fast_retrieve_symbol_proc(lf[" index "])") ))
-			(gen ")(" nf #\, carg ",av);")))
+			(gen #\;)
+			(push-args args i carg)
+			(gen #t "tp(" nf ",av);")))
 		     (else
 		      (gen #t #\t nc #\=)
 		      (expr fn i)
 		      (gen #\;)
-		      (push-args args i #f)
+		      (push-args args i (string-append "t" (number->string nc)))
 		      (gen #t "((C_proc)")
 		      (if (or unsafe no-procedure-checks (first params))
 			  (gen "(void*)(*((C_word*)t" nc "+1))")
 			  (gen "C_fast_retrieve_proc(t" nc ")") )
-		      (gen ")(" nf ",t" nc ",av);") ) ) ) )
+		      (gen ")(" nf ",av);") ) ) ) )
 	  
 	    ((##core#recurse) 
 	     (let* ([n (length subs)]
@@ -451,15 +457,15 @@
 	   (expr (car xs) i) )
 	 args) )
 
-      (define (push-args args i karg)
+      (define (push-args args i selfarg)
 	(let ((n (length args)))
-	  (gen #t "C_word av[" n "];")
-	  (when karg (gen #t "av[0]=" karg ";"))
-	  (do ((j 0 (add1 j))
+	  (gen #t "C_word av[" (+ n (if selfarg 1 0)) "];")
+	  (when selfarg (gen #t "av[0]=" selfarg ";"))
+	  (do ((j (if selfarg 1 0) (add1 j))
 	       (args args (cdr args)))
 	      ((null? args))
 	    (gen #t "av[" j "]=")
-	    (expr (car xs) i)
+	    (expr (car args) i)
 	    (gen ";"))))
 
       (expr node temps) )
@@ -574,8 +580,9 @@
 	     (when (and direct (not (zero? allocated)))
 	       (gen "C_word *a")
 	       (when (pair? varlist) (gen #\,)) )
-	     (when (or customizable direct)
-	       (apply gen varlist))
+	     (if (or customizable direct)
+		 (apply gen varlist)
+		 (gen "C_word *av"))
 	     (gen #\))
 	     ;;(when customizable (gen " C_c_regparm"))
 	     (unless direct (gen " C_noret"))
@@ -744,7 +751,9 @@
 	   (when (and direct (not (zero? demand))) 
 	     (gen "C_word *a")
 	     (when (pair? varlist) (gen #\,)) )
-	   (when (or customizable direct) (apply gen varlist))
+	   (if (or customizable direct)
+	       (apply gen varlist)
+	       (gen "C_word *av"))
 	   (gen "){")
 	   (when (eq? rest-mode 'none) (set! rest #f))
 	   (gen #t "C_word tmp;")
@@ -779,8 +788,7 @@
 			(gen #t "C_resize_stack(" target-stack-size ");") ) )
 		    (gen #t "C_check_nursery_minimum(" demand ");"
 			 #t "if(!C_demand(" demand ")){"
-			 #t "C_save(t1);"
-			 #t "C_reclaim((void*)toplevel);}"
+			 #t "C_save_and_reclaim((void*)toplevel, c, av);}"
 			 #t "toplevel_initialized=1;")
 		    (gen #t "if(!C_demand_2(" ldemand ")){"
 			 #t "C_save(t1);"
@@ -838,11 +846,12 @@
 		      (gen #t "C_word t" i #\;) )
 		    (when (> demand 0) (gen #t "C_word *a=C_alloc(" demand ");")) ]
 		   [else 
-		    (cond ((and customizable (> nec 0)) 
+		    (cond ((and customizable (> nec 0))
 			   (gen #t "C_save_and_reclaim_args((void *)tr" id "," nec ",")
-			   (apply gen arglist) )
+			   (apply gen arglist)
+			   (gen ")};"))
 			  (else
-			   (gen "C_save_and_reclaim((void *)" id ",av);")))]))
+			   (gen "C_save_and_reclaim((void *)" id "," n ",av);}")))]))
 	   (expression
 	    (lambda-literal-body ll)
 	    (if rest
Trap