~ chicken-core (chicken-5) 0d4149ed2d0c44ecd1c50ffbb106f6d8f10db149


commit 0d4149ed2d0c44ecd1c50ffbb106f6d8f10db149
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Tue Jul 12 20:28:30 2011 +0200
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Tue Jul 12 20:28:30 2011 +0200

    Revert "fixed closure conversion, nice speedup"
    
    This reverts commit 2560f00518d4b9456ddf3fa014394c81b38c2611.
    
    Not working yet (as reported by Kon) - "expand.scm" compiled
    with this change will result in csi failing syntax-tests.scm.

diff --git a/batch-driver.scm b/batch-driver.scm
index 744866e8..7e99fca7 100644
--- a/batch-driver.scm
+++ b/batch-driver.scm
@@ -149,8 +149,7 @@
 
     (define (end-time pass)
       (when time-breakdown
-	(printf "milliseconds needed for ~a: \t~s~%" pass
-		(inexact->exact (round (- (cputime) time0)) ) )))
+	(printf "milliseconds needed for ~a: \t~s~%" pass (- (cputime) time0)) ) )
 
     (define (analyze pass node . args)
       (let-optionals args ((no 0) (contf #t))
diff --git a/compiler.scm b/compiler.scm
index 973795b2..64f9bcd9 100644
--- a/compiler.scm
+++ b/compiler.scm
@@ -2103,6 +2103,7 @@
 (define (perform-closure-conversion node db)
   (let ((direct-calls 0)
 	(customizable '())
+	(captured '())
 	(lexicals '()))
 
     (define (test sym item) (get db sym item))
@@ -2115,36 +2116,35 @@
       (set! direct-calls (add1 direct-calls))
       (set! direct-call-ids (lset-adjoin eq? direct-call-ids id)) )
 
+    (define (capture var)
+      (set! captured (lset-adjoin eq? captured var)))
+
     ;; Gather free-variable information:
     ;; (and: - register direct calls
     ;;       - update (by mutation) call information in "##core#call" nodes)
-    (define (gather n here locals)
+    (define (gather n here env)
       (let ((subs (node-subexpressions n))
 	    (params (node-parameters n)) )
 	(case (node-class n)
 
 	  ((##core#variable)
 	   (let ((var (first params)))
-	     (if (memq var lexicals)
-		 (list var)
-		 '())))
+	     (when (memq var lexicals)
+	       (capture var))))
 
 	  ((quote ##core#undefined ##core#proc ##core#primitive ##core#global-ref)
-	   '())
+	   #f)
 
 	  ((let)
-	   ;;XXX remove this test later, shouldn't be needed:
+	   ;;XXX remove this test later:
 	   (when (pair? (cdr params)) (bomb "let-node has invalid format" params))
-	   (let ((c (gather (first subs) here locals))
-		 (var (first params)))
-	     (append c (delete var (gather (second subs) here (cons var locals)) eq?))))
+	   (gather (first subs) here env)
+	   (gather (second subs) here (cons (first params) env)))
 
 	  ((set!)
-	   (let ((var (first params))
-		 (c (gather (first subs) here locals)))
-	     (if (memq var lexicals) 
-		 (cons var c)
-		 c)))
+	   (let ((var (first params)))
+	     (when (memq var lexicals) (capture var))
+	     (gather (first subs) here env)))
 
 	  ((##core#call)
 	   (let* ([fn (first subs)]
@@ -2188,20 +2188,24 @@
 					'() ) )
 				  '() ) )
 			'() ) ) )
-	     (concatenate (map (cut gather <> here locals) subs) ) ))
+	     (for-each (cut gather <> here env) subs) ) )
 
 	  ((##core#lambda ##core#direct_lambda)
 	   (decompose-lambda-list
 	    (third params)
 	    (lambda (vars argc rest)
-	      (let ((id (if here (first params) 'toplevel)))
-		(fluid-let ((lexicals (append locals lexicals)))
-		  (let ((c (gather (first subs) id vars)))
-		    (put! db id 'closure-size (length c))
-		    (put! db id 'captured-variables c)
-		    (lset-difference eq? c locals vars)))))))
+	      (let* ((id (if here (first params) 'toplevel))
+		     (cap0 captured)
+		     (n (length cap0)))
+		(fluid-let ((lexicals env))
+		  (gather (first subs) id (append vars env))
+		  (let* ((n2 (length captured))
+			 (capt (take captured (- n2 n))))
+		    (print "captured: " capt " of " lexicals)
+		    (put! db id 'closure-size n2)
+		    (put! db id 'captured-variables capt)))))))
 	
-	  (else (concatenate (map (lambda (n) (gather n here locals)) subs)) ) ) ))
+	  (else (for-each (lambda (n) (gather n here env)) subs)) ) ) )
 
     ;; Create explicit closures:
     (define (transform n here closure)
Trap