Update of /project/movitz/cvsroot/movitz In directory common-lisp.net:/tmp/cvs-serv26776
Modified Files: compiler.lisp Log Message: Fixed make-compiled-lexical-control-transfer to do the right thing when jumping across dynamic bindings, finally.
Date: Sat Nov 13 17:13:02 2004 Author: ffjeld
Index: movitz/compiler.lisp diff -u movitz/compiler.lisp:1.104 movitz/compiler.lisp:1.105 --- movitz/compiler.lisp:1.104 Wed Nov 10 18:37:20 2004 +++ movitz/compiler.lisp Sat Nov 13 17:13:01 2004 @@ -8,7 +8,7 @@ ;;;; Created at: Wed Oct 25 12:30:49 2000 ;;;; Distribution: See the accompanying file COPYING. ;;;; -;;;; $Id: compiler.lisp,v 1.104 2004/11/10 17:37:20 ffjeld Exp $ +;;;; $Id: compiler.lisp,v 1.105 2004/11/13 16:13:01 ffjeld Exp $ ;;;; ;;;;------------------------------------------------------------------
@@ -5742,9 +5742,8 @@ (stack-delta from-env to-env) (assert stack-distance) (assert (null unwind-protects) () - "Lexical unwind-protect not implemented, to-env: ~S." to-env) - (when (plusp num-dynamic-slots) - (warn "Lexical jump across ~D specials." num-dynamic-slots)) + "Lexical unwind-protect not implemented, to-env: ~S. (this is not supposed to happen)" + to-env) (cond ((and (eq t stack-distance) (zerop num-dynamic-slots)) @@ -5762,7 +5761,14 @@ :env to-env :result-mode (exit-result-mode to-env) :form `(muerte::with-cloak (,return-mode) - (muerte::dynamic-unwind ,num-dynamic-slots))) + (muerte::with-inline-assembly (:returns :nothing) + ;; Compute target dynamic-env + (:locally (:movl (:edi (:edi-offset dynamic-env)) :eax)) + ,@(loop repeat num-dynamic-slots + collect `(:movl (:eax 12) :eax)) + (:locally (:call (:edi (:edi-offset dynamic-unwind-next)))) + (:locally (:movl :eax (:edi (:edi-offset dynamic-env)))) + (:jc '(:sub-program () (:int 63)))))) `((:load-lexical ,(save-esp-variable to-env) :esp) (:jmp ',to-label))))) ((zerop num-dynamic-slots) @@ -5782,7 +5788,14 @@ :env to-env :result-mode (exit-result-mode to-env) :form `(muerte::with-cloak (,return-mode) - (muerte::dynamic-unwind ,num-dynamic-slots))) + (muerte::with-inline-assembly (:returns :nothing) + ;; Compute target dynamic-env + (:locally (:movl (:edi (:edi-offset dynamic-env)) :eax)) + ,@(loop repeat num-dynamic-slots + collect `(:movl (:eax 12) :eax)) + (:locally (:call (:edi (:edi-offset dynamic-unwind-next)))) + (:locally (:movl :eax (:edi (:edi-offset dynamic-env)))) + (:jc '(:sub-program () (:int 63)))))) (make-compiled-stack-restore stack-distance (exit-result-mode to-env) return-mode)