From: Alastair Bridgewater Date: Sat, 27 Nov 2010 03:01:50 +0000 (+0000) Subject: 1.0.44.34: gtn: KLUDGE the lambda-var assignment to not break tail-calls. X-Git-Url: http://repo.macrolet.net/gitweb/?a=commitdiff_plain;h=a5bbce0fccb293efc38ce1a2f64cea8e71fa2e61;p=sbcl.git 1.0.44.34: gtn: KLUDGE the lambda-var assignment to not break tail-calls. * As an utter KLUDGE, when assigning TNs for closed-over lambda variables with implicit value-cells, make the TNs component-live instead of physenv-live. This prevents any possible problems with the new physenv introduced by a tail-call overwriting the storage for the variable. --- diff --git a/src/compiler/gtn.lisp b/src/compiler/gtn.lisp index ca2c23f..b665ddf 100644 --- a/src/compiler/gtn.lisp +++ b/src/compiler/gtn.lisp @@ -56,6 +56,16 @@ ;; 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) (physenv-live-tn res (lambda-physenv fun))) (debug-variable-p diff --git a/version.lisp-expr b/version.lisp-expr index 22758bd..d82d36f 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -20,4 +20,4 @@ ;;; 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.44.33" +"1.0.44.34"