* In order for a function to be returned or passed as a parameter,
it must have an XEP.
* Functions without XEPs, therefore, can only be called directly
from within their lexical scope. They are, therefore,
dynamic-extent.
* But wait, you say, they could be called from a closure that is
not dynamic-extent, which clearly shows such an analysis to be false.
* It turns out that this doesn't matter, because the non-dynamic-
extent closure also has to close over the variables passed to the
supposedly-dynamic-extent closure, and that will cause explicit
value-cells to be allocated anyway.
* So, it's a bit of an abuse to say that the functions have dynamic
extent, but it does no harm (and quite a bit of good) to treat them
as if they do.
;; functions), or a pointer from an underlying function to its
;; XEP (for non-:TOPLEVEL functions with XEPs).
(unless (or (leaf-dynamic-extent fun)
;; functions), or a pointer from an underlying function to its
;; XEP (for non-:TOPLEVEL functions with XEPs).
(unless (or (leaf-dynamic-extent fun)
- (and entry-fun
- (leaf-dynamic-extent entry-fun)))
+ ;; Functions without XEPs can be treated as if they
+ ;; are DYNAMIC-EXTENT, even without being so
+ ;; declared, as any escaping closure which /isn't/
+ ;; DYNAMIC-EXTENT but calls one of these functions
+ ;; will also close over the required variables, thus
+ ;; forcing the allocation of value cells. Since the
+ ;; XEP is stored in the ENTRY-FUN slot, we can pick
+ ;; off the non-XEP case here.
+ (not entry-fun)
+ (leaf-dynamic-extent entry-fun))
(let ((closure (physenv-closure (lambda-physenv fun))))
(dolist (var closure)
(when (and (lambda-var-p var)
(let ((closure (physenv-closure (lambda-physenv fun))))
(dolist (var closure)
(when (and (lambda-var-p var)
;;; checkins which aren't released. (And occasionally for internal
;;; versions, especially for internal versions off the main CVS
;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
;;; checkins which aren't released. (And occasionally for internal
;;; versions, especially for internal versions off the main CVS
;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)