X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fphysenvanal.lisp;h=2c6d8f69a0ff3568d39eed98ebf5f6416278358f;hb=5745b5a5b2e3b967bf3876b4306f31b3c78495fa;hp=ee3874e4693b541792c8d4b3997fce9b244716e0;hpb=4a90772f91fa17ea6565591eed34c484c3722419;p=sbcl.git diff --git a/src/compiler/physenvanal.lisp b/src/compiler/physenvanal.lisp index ee3874e..2c6d8f6 100644 --- a/src/compiler/physenvanal.lisp +++ b/src/compiler/physenvanal.lisp @@ -334,16 +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) - (unless (ref-p use) - (compiler-notify "could not stack allocate the result of ~S" - (find-original-source (node-source-path use))))) + (note-no-stack-allocation lvar) (setf (lvar-dynamic-extent lvar) nil))))) (node ; DX closure (let* ((call what)