From 3930f31e885a51d72369cec5eaa8bb360aa134ee Mon Sep 17 00:00:00 2001 From: Alastair Bridgewater Date: Fri, 21 Jan 2011 16:40:53 +0000 Subject: [PATCH] 1.0.45.13: physenvanal: Treat all functions without XEPs as being D-X. * 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. --- src/compiler/physenvanal.lisp | 12 ++++++++++-- version.lisp-expr | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/compiler/physenvanal.lisp b/src/compiler/physenvanal.lisp index d067c27..6148f67 100644 --- a/src/compiler/physenvanal.lisp +++ b/src/compiler/physenvanal.lisp @@ -230,8 +230,16 @@ ;; 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) diff --git a/version.lisp-expr b/version.lisp-expr index 2a3ca87..f3c41e2 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -20,4 +20,4 @@ ;;; 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".) -"1.0.45.12" +"1.0.45.13" -- 1.7.10.4