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

Frode Vatvedt Fjeld ffjeld at common-lisp.net
Fri Nov 12 16:25:11 UTC 2004


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

Modified Files:
	los0.lisp 
Log Message:
install-shallow-binding now really seems to work.

Date: Fri Nov 12 17:25:10 2004
Author: ffjeld

Index: movitz/losp/los0.lisp
diff -u movitz/losp/los0.lisp:1.24 movitz/losp/los0.lisp:1.25
--- movitz/losp/los0.lisp:1.24	Thu Nov 11 20:28:18 2004
+++ movitz/losp/los0.lisp	Fri Nov 12 17:25:09 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.24 2004/11/11 19:28:18 ffjeld Exp $
+;;;; $Id: los0.lisp,v 1.25 2004/11/12 16:25:09 ffjeld Exp $
 ;;;;                
 ;;;;------------------------------------------------------------------
 
@@ -1254,7 +1254,7 @@
     (:ret)))
 
 (defun genesis ()
-  (install-shallow-binding)
+  ;; (install-shallow-binding)
   (let ((extended-memsize 0))
     ;;  Find out how much extended memory we have 
     (setf (io-port #x70 :unsigned-byte8) #x18)
@@ -1491,9 +1491,10 @@
     (:locally (:cmpl :ecx (:edi (:edi-offset dynamic-env))))
     (:je 'install-completed)
     (:movl (:ecx 0) :eax)		; symbol
+    (:movl (:eax (:offset movitz-symbol value)) :ebx) ; symbol's old-value into EBX
+    (:movl :ebx (:ecx 4))		; save old-value in binding's scratch
     (:movl (:ecx 8) :ebx)		; new value
-    (:xchgl :ebx (:eax (:offset movitz-symbol value))) ; exchange new and old value
-    (:movl :ebx (:ecx 8))
+    (:movl :ebx (:eax (:offset movitz-symbol value))) ; install new value
     (:movl (:ecx 12) :ecx)
     (:jmp 'install-loop)
    install-completed
@@ -1517,7 +1518,7 @@
     (:cmpl :edx :ecx)
     (:je 'uninstall-completed)
     (:movl (:ecx 0) :eax)		; symbol
-    (:movl (:ecx 8) :ebx)		; old value
+    (:movl (:ecx 4) :ebx)		; old value
     (:movl :ebx (:eax (:offset movitz-symbol value))) ; reload old value
     (:movl (:ecx 12) :ecx)
     (:jmp 'uninstall-loop)
@@ -1550,15 +1551,31 @@
     (:movl :ebx (:eax (:offset movitz-symbol value)))
     (:ret)))
 
-(defun install-shallow-binding ()
-  (macrolet ((install (slot function)
-	       `(setf (%run-time-context-slot ',slot) (symbol-value ',function))))
-    (install muerte:dynamic-variable-install dynamic-variable-install-shallow)
-    (install muerte:dynamic-variable-uninstall dynamic-variable-uninstall-shallow)
-    (install muerte::dynamic-store dynamic-store-shallow)
-    (install muerte::dynamic-load-unprotected dynamic-load-unprotected-shallow)
-    (install muerte::dynamic-load dynamic-load-shallow))
-  (values))
+(defun install-shallow-binding (&key quiet)
+  (without-interrupts
+    (unless quiet
+      (warn "Installing shallow-binding strategy.."))
+    (macrolet ((install (slot function)
+		 `(prog1 (cons ',slot (%run-time-context-slot ',slot))
+		    (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-store dynamic-store-shallow)
+	    (install muerte::dynamic-load-unprotected dynamic-load-unprotected-shallow)
+	    (prog1 (install muerte::dynamic-load dynamic-load-shallow)
+	      (labels ((install-shallow-env (env)
+			 "We use this local function in order to install dynamic-env slots
+                          in reverse order, by depth-first recursion."
+			 (unless (eq 0 env)
+			   (install-shallow-env (memref env 12))
+			   (let ((name (memref env 0)))
+			     (when (symbolp name)
+			       (setf (memref env 4)
+				 (%symbol-global-value name))
+			       (setf (%symbol-global-value name)
+				 (memref env 8)))))))
+		(install-shallow-env (load-global-constant dynamic-env
+							   :thread-local t))))))))
 
 (genesis)
 





More information about the Movitz-cvs mailing list