(declare (type clambda fun))
(dolist (var (lambda-vars fun))
(when (leaf-refs var)
- (let* ((type (if (lambda-var-indirect var)
- *backend-t-primitive-type*
+ (let* (ptype-info
+ (type (if (lambda-var-indirect var)
+ (if (lambda-var-explicit-value-cell var)
+ *backend-t-primitive-type*
+ (or (first
+ (setf ptype-info
+ (primitive-type-indirect-cell-type
+ (primitive-type (leaf-type var)))))
+ *backend-t-primitive-type*))
(primitive-type (leaf-type var))))
(res (make-normal-tn type))
(node (lambda-bind fun))
;; Force closed-over indirect LAMBDA-VARs without explicit
;; VALUE-CELLs to the stack, and make sure that they are
;; live over the dynamic contour of the physenv.
- (setf (tn-sc res) (svref *backend-sc-numbers*
- sb!vm:control-stack-sc-number))
- ;; KLUDGE: In the case of a tail-local-call, the entire
- ;; stack frame is overwritten by the physenv of the called
- ;; function. Unfortunately, the tail-call appears to end
- ;; the dynamic contour of the physenv, meaning that the
- ;; stack slot occupied by the LAMBDA-VAR may be reassigned.
- ;; Ideally, we might make the TN physenv-live across the
- ;; physenvs of the tail-set of the lambda, but as a stopgap
- ;; we can make it component-live instead.
- (component-live-tn res)
- #+(or)
+ (setf (tn-sc res) (if ptype-info
+ (second ptype-info)
+ (sc-or-lose 'sb!vm::control-stack)))
(physenv-live-tn res (lambda-physenv fun)))
(debug-variable-p