X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fphysenvanal.lisp;h=2c6d8f69a0ff3568d39eed98ebf5f6416278358f;hb=5745b5a5b2e3b967bf3876b4306f31b3c78495fa;hp=ec527cf978ac63cfbabeffde3e468d5b0ca80423;hpb=09ba205d5ff72b9f4b1ffcf8743809c01a9c69e5;p=sbcl.git diff --git a/src/compiler/physenvanal.lisp b/src/compiler/physenvanal.lisp index ec527cf..2c6d8f6 100644 --- a/src/compiler/physenvanal.lisp +++ b/src/compiler/physenvanal.lisp @@ -334,11 +334,17 @@ (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 (note-no-stack-allocation lvar) (setf (lvar-dynamic-extent lvar) nil)))))