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

Frode Vatvedt Fjeld ffjeld at common-lisp.net
Thu Nov 11 11:09:38 UTC 2004


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

Modified Files:
	primitive-functions.lisp 
Log Message:
Replaced primitive-function dynamic-find-binding with
dynamic-load-unprotected, which has somewhat clearer semantics.

Date: Thu Nov 11 12:09:37 2004
Author: ffjeld

Index: movitz/losp/muerte/primitive-functions.lisp
diff -u movitz/losp/muerte/primitive-functions.lisp:1.49 movitz/losp/muerte/primitive-functions.lisp:1.50
--- movitz/losp/muerte/primitive-functions.lisp:1.49	Thu Nov 11 11:48:27 2004
+++ movitz/losp/muerte/primitive-functions.lisp	Thu Nov 11 12:09:37 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.49 2004/11/11 10:48:27 ffjeld Exp $
+;;;; $Id: primitive-functions.lisp,v 1.50 2004/11/11 11:09:37 ffjeld Exp $
 ;;;;                
 ;;;;------------------------------------------------------------------
 
@@ -213,37 +213,41 @@
     (:jnz 'loop)
    done
     (:ret)))
-
-(define-primitive-function dynamic-find-binding (symbol)
-  "Search the stack for a dynamic binding of SYMBOL.
-   On success, return Carry=1, and the address of the
-   binding in EAX. On failure, return Carry=0 and EAX unmodified.
-   Preserves EBX."
-  (with-inline-assembly (:returns :eax)
+    
+(define-primitive-function dynamic-load (symbol)
+  "Load the dynamic value of SYMBOL into EAX."
+  (with-inline-assembly (:returns :multiple-values)
     (:locally (:movl (:edi (:edi-offset dynamic-env)) :ecx))
-    (:jecxz 'fail)
+    (:jecxz 'no-stack-binding)
+    ;; Be defensive: Verify that ECX is within stack.
+    (:locally (:bound (:edi (:edi-offset stack-bottom)) :ecx))
     (:cmpl :eax (:ecx))
     (:je 'success)
-    (:locally (:movl (:edi (:edi-offset stack-top)) :edx))
    search-loop
-    (:cmpl :edx (:ecx 12))
-    (:jnc '(:sub-program () (:int 97)))
     (:movl (:ecx 12) :ecx)		; parent
-    (:jecxz 'fail)
+    (:jecxz 'no-stack-binding)
+    ;; Be defensive: Verify that ECX is within stack.
+    (:locally (:bound (:edi (:edi-offset stack-bottom)) :ecx))
     (:cmpl :eax (:ecx))			; compare name
     (:jne 'search-loop)
     ;; fall through on success
    success
-    (:leal (:ecx 8) :eax)		; location of binding value cell
-    (:stc)
+    (:movl :eax :edx)			; Keep symbol in case it's unbound.
+    (:movl (:ecx 8) :eax)
+    (:globally (:cmpl (:edi (:edi-offset unbound-value)) :eax))
+    (:je '(:sub-program (unbound) (:int 99)))
     (:ret)
-    
-   fail
-    (:clc)
+   no-stack-binding
+    ;; take the global value of SYMBOL, compare it against unbond-value
+    (:movl :eax :edx)			; Keep symbol in case it's unbound.
+    (#.movitz:*compiler-nonlocal-lispval-read-segment-prefix*
+     :movl (:eax (:offset movitz-symbol value)) :eax)
+    (:globally (:cmpl (:edi (:edi-offset unbound-value)) :eax))
+    (:je '(:sub-program (unbound) (:int 99)))
     (:ret)))
-    
-(define-primitive-function dynamic-load (symbol)
-  "Load the dynamic value of SYMBOL into EAX."
+
+(define-primitive-function dynamic-load-unprotected (symbol)
+  "Load the dynamic value of SYMBOL into EAX. If unbound, return unbound-value."
   (with-inline-assembly (:returns :multiple-values)
     (:locally (:movl (:edi (:edi-offset dynamic-env)) :ecx))
     (:jecxz 'no-stack-binding)
@@ -260,17 +264,12 @@
     (:jne 'search-loop)
     ;; fall through on success
    success
-    (:movl :eax :edx)			; Keep symbol in case it's unbound.
     (:movl (:ecx 8) :eax)
-    (:globally (:cmpl (:edi (:edi-offset unbound-value)) :eax))
-    (:je '(:sub-program (unbound) (:int 99)))
     (:ret)
    no-stack-binding
     ;; take the global value of SYMBOL, compare it against unbond-value
-    (:movl :eax :edx)			; Keep symbol in case it's unbound.
-    (:movl (:eax #.(bt:slot-offset 'movitz:movitz-symbol 'movitz::value)) :eax)
-    (:globally (:cmpl (:edi (:edi-offset unbound-value)) :eax))
-    (:je '(:sub-program (unbound) (:int 99)))
+    (#.movitz:*compiler-nonlocal-lispval-read-segment-prefix*
+     :movl (:eax (:offset movitz-symbol value)) :eax)
     (:ret)))
 
 (define-primitive-function dynamic-store (symbol value)





More information about the Movitz-cvs mailing list