X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fphysenvanal.lisp;h=a2adbcc6bf33914d964cf3f43bc5190f7c86239c;hb=a369686d65039bc87497039ac4db6c4c7c44f443;hp=d067c27d3181f3a2b4ef8e4d8143696cdc97cadc;hpb=6e1eec3ed564da272ebf0caad99384670ad4a643;p=sbcl.git diff --git a/src/compiler/physenvanal.lisp b/src/compiler/physenvanal.lisp index d067c27..a2adbcc 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) @@ -393,7 +401,7 @@ (cond (closure (setq dx t)) (t - (setf (leaf-dynamic-extent fun) nil))))) + (setf (leaf-extent fun) nil))))) (when dx (setf (lvar-dynamic-extent arg) cleanup) (real-dx-lvars arg))))))