X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fphysenvanal.lisp;h=d067c27d3181f3a2b4ef8e4d8143696cdc97cadc;hb=2e5263a05f55e2b56a3194ad7853e9ae18ad69af;hp=fe6769ca2de37d297b869aebda295fac98fec919;hpb=fb26039e896a6d89f86274b714f5be25b5fc8603;p=sbcl.git diff --git a/src/compiler/physenvanal.lisp b/src/compiler/physenvanal.lisp index fe6769c..d067c27 100644 --- a/src/compiler/physenvanal.lisp +++ b/src/compiler/physenvanal.lisp @@ -219,12 +219,24 @@ ;;; that need checking. (defun analyze-indirect-lambda-vars (component) (dolist (fun (component-lambdas component)) - (unless (leaf-dynamic-extent fun) - (let ((closure (physenv-closure (lambda-physenv fun)))) - (dolist (var closure) - (when (and (lambda-var-p var) - (lambda-var-indirect var)) - (setf (lambda-var-explicit-value-cell var) t))))))) + (let ((entry-fun (functional-entry-fun fun))) + ;; We also check the ENTRY-FUN, as XEPs for LABELS or FLET + ;; functions aren't set to be DX even if their underlying + ;; CLAMBDAs are, and if we ever get LET-bound anonymous function + ;; DX working, it would mark the XEP as being DX but not the + ;; "real" CLAMBDA. This works because a FUNCTIONAL-ENTRY-FUN is + ;; either NULL, a self-pointer (for :TOPLEVEL functions), a + ;; pointer from an XEP to its underlying function (for :EXTERNAL + ;; 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))) + (let ((closure (physenv-closure (lambda-physenv fun)))) + (dolist (var closure) + (when (and (lambda-var-p var) + (lambda-var-indirect var)) + (setf (lambda-var-explicit-value-cell var) t)))))))) ;;;; non-local exit