the symbol, prohibits both lexical and dynamic binding. This is mainly an
efficiency measure for threaded platforms, but also valueable in
expressing intent.
+ * improvement: SBCL now emits a compiler note where stack allocation was
+ requested but could not be provided.
* optimization: compiler now generates faster array typechecking code.
* optimization: ARRAY-DIMENSION is now faster for multidimensional and
non-simple arrays.
(defevent make-value-cell-event "Allocate heap value cell for lexical var.")
(defun emit-make-value-cell (node block value res)
(event make-value-cell-event node)
- (let ((leaf (tn-leaf res)))
+ (let* ((leaf (tn-leaf res))
+ (dx (when leaf (leaf-dynamic-extent leaf))))
+ (when (and dx (neq :truly dx) (leaf-has-source-name-p leaf))
+ (compiler-notify "cannot stack allocate value cell for ~S" (leaf-source-name leaf)))
(vop make-value-cell node block value
;; FIXME: See bug 419
- (and leaf (eq :truly (leaf-dynamic-extent leaf)))
+ (eq :truly dx)
res)))
\f
;;;; leaf reference
do (etypecase what
(cons
(let ((lvar (cdr what)))
- (if (lvar-good-for-dx-p lvar (car what) component)
- (let ((real (principal-lvar lvar)))
- (setf (lvar-dynamic-extent real) cleanup)
- (real-dx-lvars real))
- (setf (lvar-dynamic-extent lvar) nil))))
+ (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)))
+ (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))))
+ (setf (lvar-dynamic-extent lvar) nil)))))
(node ; DX closure
(let* ((call what)
(arg (first (basic-combination-args call)))
;;; checkins which aren't released. (And occasionally for internal
;;; versions, especially for internal versions off the main CVS
;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"1.0.28.34"
+"1.0.28.35"