mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-18 01:30:27 +02:00
Fix closure-conversion bug for SCC with all free vars pruned
* module/language/cps/closure-conversion.scm (convert-one): Fix bug when getting value of SCC whose free variables have been elided. Thanks to abcdw for the report! * test-suite/tests/compiler.test ("cse auxiliary definitions"): Remove spurious newline. ("closure conversion"): New test.
This commit is contained in:
parent
534dd35a3c
commit
12fa7d115d
2 changed files with 44 additions and 7 deletions
|
@ -504,11 +504,17 @@ Otherwise @var{var} is bound, so @var{k} is called with @var{var}."
|
|||
;; A not-well-known function with zero free vars. Copy as a
|
||||
;; constant, relying on the linker to reify just one copy.
|
||||
=> (lambda (kfun)
|
||||
(with-cps cps
|
||||
(letv var*)
|
||||
(let$ body (k var*))
|
||||
(letk k* ($kargs (#f) (var*) ,body))
|
||||
(build-term ($continue k* #f ($const-fun kfun))))))
|
||||
;; It may well be that "var" is the "self" of another
|
||||
;; member of an SCC containing just one not-well-known
|
||||
;; function. But here we're asking for the value of the
|
||||
;; closure, which is the $const-fun of the non-well-known
|
||||
;; member.
|
||||
(let ((kfun (closure-label kfun shared bound->label)))
|
||||
(with-cps cps
|
||||
(letv var*)
|
||||
(let$ body (k var*))
|
||||
(letk k* ($kargs (#f) (var*) ,body))
|
||||
(build-term ($continue k* #f ($const-fun kfun)))))))
|
||||
((intset-ref free var)
|
||||
(if (and self-known? (eqv? 1 nfree))
|
||||
;; A reference to the one free var of a well-known function.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue