X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fphysenvanal.lisp;h=2c6d8f69a0ff3568d39eed98ebf5f6416278358f;hb=95591ed483dbb8c0846c129953acac1554f28809;hp=0b923412085ae8ab5158b106a06a980b11ad739a;hpb=fbae90af33b92c5411ddcb419485dcf2bca47ab7;p=sbcl.git diff --git a/src/compiler/physenvanal.lisp b/src/compiler/physenvanal.lisp index 0b92341..2c6d8f6 100644 --- a/src/compiler/physenvanal.lisp +++ b/src/compiler/physenvanal.lisp @@ -334,17 +334,19 @@ (loop for what in (cleanup-info cleanup) do (etypecase what (cons - (let ((lvar (cdr what))) - (cond ((lvar-good-for-dx-p lvar (car what) component) - (let ((real (principal-lvar lvar))) - (setf (lvar-dynamic-extent real) cleanup) - (real-dx-lvars real))) + (let ((dx (car what)) + (lvar (cdr what))) + (cond ((lvar-good-for-dx-p lvar dx component) + ;; Since the above check does deep + ;; checks. we need to deal with the deep + ;; results in here as well. + (dolist (cell (handle-nested-dynamic-extent-lvars + dx lvar component)) + (let ((real (principal-lvar (cdr cell)))) + (setf (lvar-dynamic-extent real) cleanup) + (real-dx-lvars real)))) (t - (do-uses (use lvar) - (let ((source (find-original-source (node-source-path use)))) - (unless (symbolp source) - (compiler-notify "could not stack allocate the result of ~S" - source)))) + (note-no-stack-allocation lvar) (setf (lvar-dynamic-extent lvar) nil))))) (node ; DX closure (let* ((call what)