[movitz-cvs] CVS update: movitz/special-operators-cl.lisp
Frode Vatvedt Fjeld
ffjeld at common-lisp.net
Fri Oct 8 10:26:41 UTC 2004
Update of /project/movitz/cvsroot/movitz
In directory common-lisp.net:/tmp/cvs-serv9027
Modified Files:
special-operators-cl.lisp
Log Message:
Fix non-local go to work across unwind-protects.
Date: Fri Oct 8 12:26:38 2004
Author: ffjeld
Index: movitz/special-operators-cl.lisp
diff -u movitz/special-operators-cl.lisp:1.25 movitz/special-operators-cl.lisp:1.26
--- movitz/special-operators-cl.lisp:1.25 Thu Oct 7 14:52:47 2004
+++ movitz/special-operators-cl.lisp Fri Oct 8 12:26:38 2004
@@ -9,7 +9,7 @@
;;;; Created at: Fri Nov 24 16:31:11 2000
;;;; Distribution: See the accompanying file COPYING.
;;;;
-;;;; $Id: special-operators-cl.lisp,v 1.25 2004/10/07 12:52:47 ffjeld Exp $
+;;;; $Id: special-operators-cl.lisp,v 1.26 2004/10/08 10:26:38 ffjeld Exp $
;;;;
;;;;------------------------------------------------------------------
@@ -725,20 +725,18 @@
(compiler-values ()
:returns :non-local-exit
:code `((:lexical-control-transfer nil :nothing ,env ,tagbody-env ,label)))
- ;; Perform a lexical "throw" to the tag. Much like a regular throw, except
- ;; no values are transferred, and we step _into_ that dynamic env, not outside it.
+ ;; Perform a lexical "throw" to the tag. Just like a regular (dynamic) throw.
(let ((save-esp-binding (movitz-binding (save-esp-variable tagbody-env) env))
(label-id (movitz-env-get tag 'go-tag-label-id nil tagbody-env nil)))
(assert label-id)
- #+ignore
- (compiler-call #'compile-form-unprotected
- :forward all
- :form `(muerte::exact-throw ,(movitz-env-lexical-catch-tag-variable tagbody-env)
- 0 nil))
(compiler-values ()
:returns :non-local-exit
:code `((:load-lexical ,save-esp-binding :edx)
(:movl :edx :eax)
+ ,@(when (plusp label-id)
+ ;; The target jumper points to the tagbody's label-set.
+ ;; Now, install correct jumper within tagbody as target.
+ `((:addl ,(* 4 label-id) (:edx 8))))
(:globally (:call (:edi (:edi-offset dynamic-unwind-next))))
(:jnc '(:sub-program () (:int 63)))
;; have next-continuation in EAX, final-continuation in EDX
@@ -749,26 +747,8 @@
(:movl (:esp) :eax) ; target stack-frame EBP
(:movl (:eax -4) :esi) ; get target funobj into ESI
(:movl (:esp 8) :eax) ; target jumper number
- (:jmp (:esi :eax
- ,(* 4 label-id) ,(slot-offset 'movitz-funobj 'constant0)))))
- #+ignore
- (compiler-values ()
- :returns :non-local-exit
- :code (append (compiler-call #'compile-form
- :result-mode :eax
- :forward all
- :form (movitz-env-lexical-catch-tag-variable tagbody-env))
- `((:xorl :ebx :ebx)
- (:globally (:call (:edi (:edi-offset dynamic-locate-catch-tag))))
- (:jnc '(:sub-program () (:int 108)))
- (:locally (:bound (:edi (:edi-offset stack-bottom)) :eax))
- (:movl :eax :esp)
- (:movl (:esp) :ebp)
- (:movl (:ebp -4) :esi)
- (:locally (:movl :eax (:edi (:edi-offset dynamic-env)))) ; enter dynamic env
- (:movl (:esp 8) :ecx) ; label-set base
- (:jmp (:esi :ecx ,(+ (slot-offset 'movitz-funobj 'constant0)
- (* 4 label-id)))))))))))) ; transfer control, finally.
+ (:clc)
+ (:jmp (:esi :eax ,(slot-offset 'movitz-funobj 'constant0))))))))))
(define-special-operator block (&all forward &funobj funobj &form form &env env
&result-mode result-mode)
More information about the Movitz-cvs
mailing list