~ chicken-core (chicken-5) b9898e4d1ae404b04316351c5de9329e7aa336b5


commit b9898e4d1ae404b04316351c5de9329e7aa336b5
Author:     LemonBoy <thatlemon@gmail.com>
AuthorDate: Mon Mar 27 16:05:23 2017 +0200
Commit:     Evan Hanson <evhan@foldling.org>
CommitDate: Mon Apr 10 07:11:21 2017 +1200

    Fix a bug in scan-toplevel-assignments walk routine
    
    Commit [ac8f2dadd] introduced a bug in the node walking routine. We end
    up evaluating only the first two subexpression for some kind of nodes,
    this means the else branch for if/cond nodes is never walked and neither
    is most of ##core#switch since we stop the walk at the first constant
    node.
    
    Signed-off-by: Peter Bex <peter@more-magic.net>
    Signed-off-by: Evan Hanson <evhan@foldling.org>

diff --git a/optimizer.scm b/optimizer.scm
index 63a9b7d3..a6df2fde 100644
--- a/optimizer.scm
+++ b/optimizer.scm
@@ -71,8 +71,11 @@
       (set! escaped #t)
       (set! previous '()))
 
-    (define (scan-each ns e)
-      (for-each (lambda (n) (scan n e)) ns) )
+    (define (scan-each ns e clear-previous?)
+      (for-each (lambda (n)
+		  (when clear-previous? (set! previous '()))
+		  (scan n e))
+		ns))
 
     (define (scan n e)
       (let ([params (node-parameters n)]
@@ -89,12 +92,10 @@
 	  [(if ##core#cond ##core#switch)
 	   (scan (first subs) e)
 	   (touch)
-	   (scan (first subs) e)
-	   (set! previous '())
-	   (scan (second subs) e)]
+	   (scan-each (cdr subs) e #t)]
 
 	  [(let)
-	   (scan-each (butlast subs) e)
+	   (scan-each (butlast subs) e #f)
 	   (scan (last subs) (append params e)) ]
 
 	  [(lambda ##core#lambda) #f]
@@ -118,7 +119,7 @@
 	       (unless (memq var e) (mark var))
 	       (remember var n) ) ) ]
 
-	  [else (scan-each subs e)] ) ) )
+	  [else (scan-each subs e #f)])))
 
     (debugging 'p "scanning toplevel assignments...")
     (scan node '())
Trap