~ chicken-core (chicken-5) 7893f6eb521dcfe91f49726e9ee7c0ab7a33f74a
commit 7893f6eb521dcfe91f49726e9ee7c0ab7a33f74a Author: felix <felix@call-with-current-continuation.org> AuthorDate: Tue Jul 12 20:29:31 2011 +0200 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Tue Jul 12 20:29:31 2011 +0200 Revert "trying to do sensible closure-conversion" This reverts commit 80708c08b4da846879ccd2b320fe1525931f211f. diff --git a/compiler.scm b/compiler.scm index 64f9bcd9..1779d6f4 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. @@ -2097,14 +2097,11 @@ ;;; 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 '()) - (captured '()) - (lexicals '())) + (let ([direct-calls 0] + [customizable '()] ) (define (test sym item) (get db sym item)) @@ -2116,9 +2113,6 @@ (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) @@ -2127,24 +2121,12 @@ (params (node-parameters n)) ) (case (node-class n) - ((##core#variable) - (let ((var (first params))) - (when (memq var lexicals) - (capture var)))) - - ((quote ##core#undefined ##core#proc ##core#primitive ##core#global-ref) - #f) + ((quote ##core#variable ##core#undefined ##core#proc ##core#primitive ##core#global-ref) #f) ((let) - ;;XXX remove this test later: - (when (pair? (cdr params)) (bomb "let-node has invalid format" params)) - (gather (first subs) here env) - (gather (second subs) here (cons (first params) env))) - - ((set!) - (let ((var (first params))) - (when (memq var lexicals) (capture var)) - (gather (first subs) here env))) + (receive (vals body) (split-at subs (length params)) + (for-each (lambda (n) (gather n here env)) vals) + (gather (first body) here (append params env)) ) ) ((##core#call) (let* ([fn (first subs)] @@ -2188,22 +2170,18 @@ '() ) ) '() ) ) '() ) ) ) - (for-each (cut gather <> here env) subs) ) ) + (for-each (lambda (n) (gather n here env)) subs) ) ) ((##core#lambda ##core#direct_lambda) (decompose-lambda-list (third params) (lambda (vars argc rest) - (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))))))) + (let* ([id (if here (first params) 'toplevel)] + [capturedvars (captured-variables (car subs) env)] + [csize (length capturedvars)] ) + (put! db id 'closure-size csize) + (put! db id 'captured-variables capturedvars) + (gather (car subs) id (append vars env)) ) ) ) ) (else (for-each (lambda (n) (gather n here env)) subs)) ) ) ) @@ -2353,6 +2331,24 @@ (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