[movitz-cvs] CVS update: movitz/special-operators.lisp

Frode Vatvedt Fjeld ffjeld at common-lisp.net
Fri Sep 17 11:12:50 UTC 2004


Update of /project/movitz/cvsroot/movitz
In directory common-lisp.net:/tmp/cvs-serv6279

Modified Files:
	special-operators.lisp 
Log Message:
Re-working of non-local control transfer so as to comply with the
stack discipline.

Date: Fri Sep 17 13:12:49 2004
Author: ffjeld

Index: movitz/special-operators.lisp
diff -u movitz/special-operators.lisp:1.38 movitz/special-operators.lisp:1.39
--- movitz/special-operators.lisp:1.38	Wed Sep 15 12:22:52 2004
+++ movitz/special-operators.lisp	Fri Sep 17 13:12:49 2004
@@ -8,7 +8,7 @@
 ;;;; Author:        Frode Vatvedt Fjeld <frodef at acm.org>
 ;;;; Created at:    Fri Nov 24 16:22:59 2000
 ;;;;                
-;;;; $Id: special-operators.lisp,v 1.38 2004/09/15 10:22:52 ffjeld Exp $
+;;;; $Id: special-operators.lisp,v 1.39 2004/09/17 11:12:49 ffjeld Exp $
 ;;;;                
 ;;;;------------------------------------------------------------------
 
@@ -1178,9 +1178,14 @@
   (destructuring-bind (tag context value-form)
       (cdr form)
     (let* ((local-env (make-local-movitz-environment env funobj :type 'let-env))
-	   (dynamic-slot-binding (movitz-env-add-binding local-env
-							 (make-instance 'located-binding
-							   :name (gensym "dynamic-slot-")))))
+	   (dynamic-slot-binding
+	    (movitz-env-add-binding local-env
+				    (make-instance 'located-binding
+				      :name (gensym "dynamic-slot-"))))
+	   (next-continuation-step-binding
+	    (movitz-env-add-binding local-env
+				    (make-instance 'located-binding
+				      :name (gensym "continuation-step-")))))
       (with-labels (throw (save-tag-var save-context-var))
 	(compiler-values ()
 	  :returns :non-local-exit
@@ -1196,7 +1201,9 @@
 				       (:globally (:call (:edi (:edi-offset dynamic-locate-catch-tag))))
 				       (:jnc '(:sub-program () (:int 108)))
 				       (:store-lexical ,dynamic-slot-binding :eax :type t)
-				       )))) ; save dynamic-slot in EBP
+				       (:globally (:call (:edi (:edi-offset dynamic-unwind-next))))
+				       (:store-lexical ,next-continuation-step-binding :eax :type t)
+				       ))))
 			;; now outside of m-v-prog1's cloak, with final dynamic-slot in ESP..
 			;; ..unwind it and transfer control.
 			;;
@@ -1207,11 +1214,14 @@
 ;;;			`((:load-lexical ,dynamic-slot-binding :edx)
 ;;;			  ())
 			`((:load-lexical ,dynamic-slot-binding :edx)
+			  (:locally (:movl :edx (:edi (:edi-offset raw-scratch0)))) ; final continuation
+			  (:load-lexical ,next-continuation-step-binding :edx) ; next continuation-step
 			  (:locally (:movl :esi (:edi (:edi-offset scratch1))))
+			  (:locally (:movl :edx (:edi (:edi-offset dynamic-env)))) ; exit dynamic-env
 			  (:movl :edx :esp) ; enter non-local jump stack mode.
 			  
 			  (:movl (:esp) :edx) ; target stack-frame EBP
-			  (:movl (:edx -4) :esi) ; get target funobj into EDX
+			  (:movl (:edx -4) :esi) ; get target funobj into ESI
 			  
 			  (:movl (:esp 8) :edx) ; target jumper number
 			  (:jmp (:esi :edx ,(slot-offset 'movitz-funobj 'constant0))))))))))
@@ -1293,7 +1303,8 @@
 			  :form body)
 			`((:leal (:esp ,(+ -12 -4 (* 4 entry-size))) :esp)
 			  ,exit-point
+			  (:movl (:esp 12) :edx)
+			  (:locally (:movl :edx (:edi (:edi-offset dynamic-env))))
 			  (:popl :ebp)
-			  (:leal (:esp 8) :esp)
-			  (:locally (:popl (:edi (:edi-offset dynamic-env))))
+			  (:leal (:esp 12) :esp)
 			  )))))))





More information about the Movitz-cvs mailing list