[movitz-cvs] CVS update: movitz/losp/muerte/primitive-functions.lisp

Frode Vatvedt Fjeld ffjeld at common-lisp.net
Wed Nov 10 17:34:55 UTC 2004


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

Modified Files:
	primitive-functions.lisp 
Log Message:
Added support for pliant protocol for dynamic binding.

Date: Wed Nov 10 18:34:51 2004
Author: ffjeld

Index: movitz/losp/muerte/primitive-functions.lisp
diff -u movitz/losp/muerte/primitive-functions.lisp:1.47 movitz/losp/muerte/primitive-functions.lisp:1.48
--- movitz/losp/muerte/primitive-functions.lisp:1.47	Thu Oct 21 22:34:09 2004
+++ movitz/losp/muerte/primitive-functions.lisp	Wed Nov 10 18:34:51 2004
@@ -10,7 +10,7 @@
 ;;;; Author:        Frode Vatvedt Fjeld <frodef at acm.org>
 ;;;; Created at:    Tue Oct  2 21:02:18 2001
 ;;;;                
-;;;; $Id: primitive-functions.lisp,v 1.47 2004/10/21 20:34:09 ffjeld Exp $
+;;;; $Id: primitive-functions.lisp,v 1.48 2004/11/10 17:34:51 ffjeld Exp $
 ;;;;                
 ;;;;------------------------------------------------------------------
 
@@ -111,16 +111,22 @@
 ;;;  -32: car ...
 
 (define-primitive-function dynamic-unwind-next (dynamic-env)
-  "Locate the next unwind-protect entry between here and 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."
+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))
     (:globally (:movl (:edi (:edi-offset unwind-protect-tag)) :ebx))
     (:locally (:movl (:edi (:edi-offset dynamic-env)) :ecx))
     
    search-loop
-    (:jecxz '(:sub-program () (:halt) (:int 63))) ; XXX don't halt
+    (:jecxz '(:sub-program () (:int 63)))
     (:locally (:bound (:edi (:edi-offset stack-bottom)) :ecx))
 
     (:cmpl :ecx :eax)
@@ -129,6 +135,9 @@
     (:cmpl :ebx (:ecx 4))		; unwind-protect entry?
     (:je 'found-unwind-protect)
     
+    ;; We don't need to check for and uninstall dynamic binding entries,
+    ;; because uninstall is a NOP under naive deep binding.
+    
     (:movl (:ecx 12) :ecx)		; proceed search
     (:jmp 'search-loop)
    found-unwind-protect
@@ -136,7 +145,20 @@
     (:stc)
    found-dynamic-env
     (:ret)))
-  
+
+(define-primitive-function dynamic-variable-install ()
+  ""
+  (with-inline-assembly (:returns :nothing)
+    (:ret)))
+
+(define-primitive-function dynamic-variable-uninstall (dynamic-env)
+  "Uninstall each dynamic binding between 'here' (i.e. the current 
+dynamic environment pointer) and the dynamic-env pointer provided in EDX.
+This must be done without affecting 'current values'! (i.e. eax, ebx, ecx, or CF),
+and also EDX must not be affected."
+  (with-inline-assembly (:returns :nothing)
+    ;; Default binding strategy is naive deep binding, so this is a NOP.
+    (:ret)))
 
 (define-primitive-function dynamic-locate-catch-tag (tag)
   "Search the dynamic environment for a catch slot matching <tag> in EAX.





More information about the Movitz-cvs mailing list