[movitz-cvs] CVS update: movitz/losp/los0.lisp

Frode Vatvedt Fjeld ffjeld at common-lisp.net
Fri Nov 12 20:55:51 UTC 2004


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

Modified Files:
	los0.lisp 
Log Message:
Add dynamic-unwind-next-shallow.

Date: Fri Nov 12 21:55:49 2004
Author: ffjeld

Index: movitz/losp/los0.lisp
diff -u movitz/losp/los0.lisp:1.25 movitz/losp/los0.lisp:1.26
--- movitz/losp/los0.lisp:1.25	Fri Nov 12 17:25:09 2004
+++ movitz/losp/los0.lisp	Fri Nov 12 21:55:49 2004
@@ -9,7 +9,7 @@
 ;;;; Created at:    Fri Dec  1 18:08:32 2000
 ;;;; Distribution:  See the accompanying file COPYING.
 ;;;;                
-;;;; $Id: los0.lisp,v 1.25 2004/11/12 16:25:09 ffjeld Exp $
+;;;; $Id: los0.lisp,v 1.26 2004/11/12 20:55:49 ffjeld Exp $
 ;;;;                
 ;;;;------------------------------------------------------------------
 
@@ -1530,6 +1530,47 @@
     (:stc)
     (:ret)))
 
+(define-primitive-function dynamic-unwind-next-shallow (dynamic-env)
+  "Locate the next unwind-protect entry between here and dynamic-env/EAX.
+If no such entry is found, return (same) dynamic-env in EAX and CF=0.
+Otherwise return the unwind-protect entry in EAX and CF=1. Preserve EDX.
+Point is: Return the 'next step' in unwinding towards dynamic-env.
+Note that it's an error if dynamic-env isn't in the current dynamic environment,
+it's supposed to have been found by e.g. dynamic-locate-catch-tag."
+  ;; XXX: Not really sure if there's any point in the CF return value,
+  ;;      because I don't think there's ever any need to know whether
+  ;;      the returned entry is an unwind-protect or the actual target.
+  (with-inline-assembly (:returns :nothing)
+    (:locally (:bound (:edi (:edi-offset stack-bottom)) :eax))
+    (:locally (:movl :eax (:edi (:edi-offset scratch2)))) ; Free up EAX
+    ;; (:globally (:movl (:edi (:edi-offset unwind-protect-tag)) :ebx))
+    (:locally (:movl (:edi (:edi-offset dynamic-env)) :ecx))
+    
+   search-loop
+    (:jecxz '(:sub-program () (:int 63)))
+    (:locally (:bound (:edi (:edi-offset stack-bottom)) :ecx))
+
+    (:locally (:cmpl :ecx (:edi (:edi-offset scratch2))))
+    (:je 'found-dynamic-env)
+
+    (:movl (:ecx 4) :ebx)
+    (:globally (:cmpl :ebx (:edi (:edi-offset unwind-protect-tag))))
+    (:je 'found-unwind-protect)
+
+    ;; If this entry is a dynamic variable binding, uninstall it.
+    (:movl (:ecx) :eax)			; symbol?
+    (:testb 3 :al)			;
+    (:jz 'not-variable-binding)		; not symbol?
+    (:movl :ebx (:eax (:offset movitz-symbol value))) ; uninstall.
+   not-variable-binding
+    (:movl (:ecx 12) :ecx)		; proceed search
+    (:jmp 'search-loop)
+   found-unwind-protect
+    (:stc)
+   found-dynamic-env
+    (:movl :ecx :eax)
+    (:ret)))
+
 (define-primitive-function dynamic-load-shallow (symbol)
   "Load the dynamic value of SYMBOL into EAX."
   (with-inline-assembly (:returns :multiple-values)
@@ -1560,6 +1601,7 @@
 		    (setf (%run-time-context-slot ',slot) (symbol-value ',function)))))
       (list (install muerte:dynamic-variable-install dynamic-variable-install-shallow)
 	    (install muerte:dynamic-variable-uninstall dynamic-variable-uninstall-shallow)
+	    (install muerte::dynamic-unwind-next dynamic-unwind-next-shallow)
 	    (install muerte::dynamic-store dynamic-store-shallow)
 	    (install muerte::dynamic-load-unprotected dynamic-load-unprotected-shallow)
 	    (prog1 (install muerte::dynamic-load dynamic-load-shallow)





More information about the Movitz-cvs mailing list