mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-20 02:30:23 +02:00
fix self tail recursion to different case-lambda clauses
http://savannah.gnu.org/bugs/?33362 * module/language/tree-il/compile-glil.scm (flatten-lambda-case): Rename from flatten, as it really just takes a particular case. Instead of iteratively compiling lambda cases through `comp', tail-call through flatten-lambda-case. This allows code to see which case it's being compiled in. Take advantage of that to limit the self-tail-call optimization to self-calls to the same case -- otherwise we might be jumping to a label without having reserved the right number of locals. (flatten-lambda): Adapt the caller. * test-suite/tests/compiler.test ("case-lambda"): Add a test.
This commit is contained in:
parent
ad0fedbf82
commit
0083cb5ec4
2 changed files with 42 additions and 39 deletions
|
@ -1,5 +1,5 @@
|
|||
;;;; compiler.test --- tests for the compiler -*- scheme -*-
|
||||
;;;; Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
|
||||
;;;; Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
|
||||
;;;;
|
||||
;;;; This library is free software; you can redistribute it and/or
|
||||
;;;; modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -149,3 +149,18 @@
|
|||
((y) y)
|
||||
((y z) (list y z)))))))
|
||||
(not (not (memv 0 (map source:addr s))))))))
|
||||
|
||||
(with-test-prefix "case-lambda"
|
||||
(pass-if "self recursion to different clause"
|
||||
(equal? (with-output-to-string
|
||||
(lambda ()
|
||||
(let ()
|
||||
(define t
|
||||
(case-lambda
|
||||
((x)
|
||||
(t x 'y))
|
||||
((x y)
|
||||
(display (list x y))
|
||||
(list x y))))
|
||||
(display (t 'x)))))
|
||||
"(x y)(x y)")))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue