~ chicken-core (chicken-5) 7a9d96def782128ec33db66b2319c6e14d42806c
commit 7a9d96def782128ec33db66b2319c6e14d42806c Author: felix <felix@call-with-current-continuation.org> AuthorDate: Fri Jul 15 16:07:55 2011 +0200 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Fri Jul 15 16:07:55 2011 +0200 enabled linear-cc again diff --git a/compiler.scm b/compiler.scm index 7fc629d7..3e5b6b35 100644 --- a/compiler.scm +++ b/compiler.scm @@ -4,7 +4,7 @@ ; "This is insane. What we clearly want to do is not exactly clear, and is rooted in NCOMPLR." ; ; -;-------------------------------------------------------------------------------------------------- +;-------------------------------------------------------------------------------------------- ; Copyright (c) 2008-2011, The Chicken Team ; Copyright (c) 2000-2007, Felix L. Winkelmann ; All rights reserved. @@ -2105,11 +2105,13 @@ ;;; Collect unsafe global procedure calls that are assigned: -;;; Convert closures to explicit data structures (effectively flattens function-binding structure): +;;; Convert closures to explicit data structures (effectively flattens function-binding +; structure): (define (perform-closure-conversion node db) - (let ([direct-calls 0] - [customizable '()] ) + (let ((direct-calls 0) + (customizable '()) + (lexicals '())) (define (test sym item) (get db sym item)) @@ -2124,17 +2126,33 @@ ;; Gather free-variable information: ;; (and: - register direct calls ;; - update (by mutation) call information in "##core#call" nodes) - (define (gather n here env) + (define (gather n here locals) (let ((subs (node-subexpressions n)) (params (node-parameters n)) ) (case (node-class n) - ((quote ##core#variable ##core#undefined ##core#proc ##core#primitive ##core#global-ref) #f) + ((##core#variable) + (let ((var (first params))) + (if (memq var lexicals) + (list var) + '()))) + + ((quote ##core#undefined ##core#proc ##core#primitive ##core#global-ref) + '()) ((let) - (receive (vals body) (split-at subs (length params)) - (for-each (lambda (n) (gather n here env)) vals) - (gather (first body) here (append params env)) ) ) + ;;XXX remove this test later, shouldn't be needed: + (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?)))) + + ((set!) + (let ((var (first params)) + (c (gather (first subs) here locals))) + (if (memq var lexicals) + (cons var c) + c))) ((##core#call) (let* ([fn (first subs)] @@ -2178,7 +2196,7 @@ '() ) ) '() ) ) '() ) ) ) - (for-each (lambda (n) (gather n here env)) subs) ) ) + (concatenate (map (lambda (n) (gather n here locals)) subs) ) )) ((##core#lambda ##core#direct_lambda) (decompose-lambda-list @@ -2191,7 +2209,7 @@ (put! db id 'captured-variables c) (lset-difference eq? c locals vars))))))) - (else (for-each (lambda (n) (gather n here env)) subs)) ) ) ) + (else (concatenate (map (lambda (n) (gather n here locals)) subs)) ) ) )) ;; Create explicit closures: (define (transform n here closure) @@ -2339,24 +2357,6 @@ (list (varnode here)) ) ) ) (else n) ) ) ) - (define (captured-variables node env) - (let ([vars '()]) - (let walk ([n node]) - (let ((subs (node-subexpressions n)) - (params (node-parameters n)) ) - (case (node-class n) - ((##core#variable) - (let ([var (first params)]) - (when (memq var env) - (set! vars (lset-adjoin eq? vars var)) ) ) ) - ((quote ##core#undefined ##core#primitive ##core#proc ##core#inline_ref ##core#global-ref) #f) - ((set!) - (let ([var (first params)]) - (when (memq var env) (set! vars (lset-adjoin eq? vars var))) - (walk (car subs)) ) ) - (else (for-each walk subs)) ) ) ) - vars) ) - (debugging 'p "closure conversion gathering phase...") (gather node #f '()) (when (pair? customizable)Trap