From: Alastair B. <lis...@us...> - 2010-11-27 03:01:59
|
Update of /cvsroot/sbcl/sbcl/src/compiler In directory sfp-cvsdas-3.v30.ch3.sourceforge.com:/tmp/cvs-serv27373/src/compiler Modified Files: gtn.lisp Log Message: 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. Index: gtn.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/src/compiler/gtn.lisp,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- gtn.lisp 9 Nov 2010 19:45:23 -0000 1.19 +++ gtn.lisp 27 Nov 2010 03:01:50 -0000 1.20 @@ -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 |