[movitz-cvs] CVS update: movitz/losp/muerte/los-closette.lisp

Frode Vatvedt Fjeld ffjeld at common-lisp.net
Tue May 3 20:07:51 UTC 2005


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

Modified Files:
	los-closette.lisp 
Log Message:
Cleaned up compute-effective-slot-reader/writer: made it a generic function.

Date: Tue May  3 22:07:51 2005
Author: ffjeld

Index: movitz/losp/muerte/los-closette.lisp
diff -u movitz/losp/muerte/los-closette.lisp:1.27 movitz/losp/muerte/los-closette.lisp:1.28
--- movitz/losp/muerte/los-closette.lisp:1.27	Sun May  1 01:22:19 2005
+++ movitz/losp/muerte/los-closette.lisp	Tue May  3 22:07:50 2005
@@ -10,7 +10,7 @@
 ;;;; Author:        Frode Vatvedt Fjeld <frodef at acm.org>
 ;;;; Created at:    Tue Jul 23 14:29:10 2002
 ;;;;                
-;;;; $Id: los-closette.lisp,v 1.27 2005/04/30 23:22:19 ffjeld Exp $
+;;;; $Id: los-closette.lisp,v 1.28 2005/05/03 20:07:50 ffjeld Exp $
 ;;;;                
 ;;;;------------------------------------------------------------------
 
@@ -872,23 +872,40 @@
 
 
 (defmacro define-effective-slot-reader (name location)
-  `(defun ,name (instance)
-     (with-inline-assembly (:returns :multiple-values)
-       (:compile-form (:result-mode :eax) instance)
-       (#.movitz:*compiler-nonlocal-lispval-read-segment-prefix*
-	:movl (:eax (:offset movitz-std-instance slots))
-	      :eax)
-       (#.movitz:*compiler-nonlocal-lispval-read-segment-prefix*
-	:movl (:eax (:offset movitz-basic-vector data ,(* location 4))) :eax)
-       (#.movitz:*compiler-global-segment-prefix*
-	:cmpl :eax ,(movitz::make-indirect-reference :edi (movitz::global-constant-offset
-							   'new-unbound-value)))
-       (:je '(:sub-program (unbound)
-	      (:compile-form (:result-mode :multiple-values)
-	       (slot-unbound-trampoline instance ,location))
-	      (:jmp 'done)))
-       (:clc)
-       done)))
+  (if movitz::*compiler-use-into-unbound-protocol*
+      `(defun ,name (instance)
+	 (with-inline-assembly (:returns :multiple-values)
+	   (:compile-form (:result-mode :eax) instance)
+	   (#.movitz:*compiler-nonlocal-lispval-read-segment-prefix*
+	    :movl (:eax (:offset movitz-std-instance slots))
+	    :eax)
+	   (#.movitz:*compiler-nonlocal-lispval-read-segment-prefix*
+	    :movl (:eax (:offset movitz-basic-vector data ,(* location 4))) :eax)
+	   (#.movitz:*compiler-global-segment-prefix*
+	    :cmpl  -1 :eax)
+	   (:jo '(:sub-program (unbound)
+		  (:compile-form (:result-mode :multiple-values)
+		   (slot-unbound-trampoline instance ,location))
+		  (:jmp 'done)))
+	   (:clc)
+	  done))
+    `(defun ,name (instance)
+       (with-inline-assembly (:returns :multiple-values)
+	 (:compile-form (:result-mode :eax) instance)
+	 (#.movitz:*compiler-nonlocal-lispval-read-segment-prefix*
+	  :movl (:eax (:offset movitz-std-instance slots))
+	  :eax)
+	 (#.movitz:*compiler-nonlocal-lispval-read-segment-prefix*
+	  :movl (:eax (:offset movitz-basic-vector data ,(* location 4))) :eax)
+	 (#.movitz:*compiler-global-segment-prefix*
+	  :cmpl :eax ,(movitz::make-indirect-reference :edi (movitz::global-constant-offset
+							     'new-unbound-value)))
+	 (:je '(:sub-program (unbound)
+		(:compile-form (:result-mode :multiple-values)
+		 (slot-unbound-trampoline instance ,location))
+		(:jmp 'done)))
+	 (:clc)
+	done))))
 
 (defparameter *standard-effective-slot-readers*
     #(standard-effective-slot-reader%0
@@ -911,30 +928,8 @@
 (define-effective-slot-reader standard-effective-slot-reader%6 6)
 (define-effective-slot-reader standard-effective-slot-reader%7 7)
 
-(defun compute-effective-slot-reader (class slot-definition)
-  (let* ((slot-name (slot-definition-name slot-definition))
-	 (slot (find-slot class slot-name)))
-    (assert slot (slot-name)
-      "No slot named ~S in class ~S." slot-name class)
-    (let ((slot-location (slot-definition-location slot)))
-      (check-type slot-location (integer 0 #xffff))
-      (etypecase class
-	(standard-class
-	 (if (and (< slot-location (length *standard-effective-slot-readers*))
-		  (svref *standard-effective-slot-readers* slot-location))
-	     (symbol-function (svref *standard-effective-slot-readers* slot-location))
-	   (lambda (instance)
-	     (let ((x (standard-instance-access instance slot-location)))
-	       (if (not (eq x (load-global-constant new-unbound-value)))
-		   x
-		 (slot-unbound-trampoline instance slot-location))))))
-	(funcallable-standard-class
-	 (lambda (instance)
-	   (let ((x (svref (std-gf-instance-slots instance) slot-location)))
-	     (if (not (eq x (load-global-constant new-unbound-value)))
-		 x
-	       (slot-unbound-trampoline instance slot-location)))))))))
 
+#+ignore
 (defun compute-effective-slot-writer (class slot-definition)
   (let* ((slot-name (slot-definition-name slot-definition))
 	 (slot (find-slot class slot-name)))
@@ -1211,7 +1206,7 @@
 	      (push indicator initargs)))))))
   initargs)
 
-(defmethod make-instance ((class standard-class) &rest initargs)
+(defmethod make-instance ((class std-slotted-class) &rest initargs)
   (declare (dynamic-extent initargs))
   (let ((defaulted-initargs (compute-defaulted-initargs class initargs)))
     (apply 'initialize-instance
@@ -1274,10 +1269,14 @@
 (define-slot-reader-method slot-definition-initform
     (standard-slot-definition initform))
 
-(defun find-slot (class slot-name)
+(defun find-slot (class slot-name &optional error-instance operation new-value)
   (dolist (slot (if (eq class *the-class-standard-class*)
 		    *the-slots-of-standard-class*
-		  (class-slots class)) #+ignore (error "The slot ~S doesn't exist in ~S." slot-name class))
+		  (class-slots class))
+	    (case error-instance
+	      ((nil))
+	      ((t) (error "No slot named ~S in class ~S." slot-name class))
+	      (t (slot-missing class error-instance slot-name operation new-value))))
     (when (eql slot-name (slot-definition-name slot))
       (return slot))))
 
@@ -1291,8 +1290,7 @@
       val)))
 
 (defun std-gf-slot-value (instance slot-name)
-  (let ((slot (find-slot (std-gf-instance-class instance) slot-name)))
-    (assert slot)
+  (let ((slot (find-slot (std-gf-instance-class instance) slot-name t)))
     (let* ((location (slot-definition-location slot))
 	   (slots (std-gf-instance-slots instance))
 	   (val (svref slots location)))
@@ -1396,6 +1394,7 @@
       (when (eql slot-name (slot-definition-name slot))
 	(return t)))))
 
+
 ;;; Specializers
 
 (defun eql-specializer-p (specializer)
@@ -1426,6 +1425,41 @@
     (typep object specializer)))
 
 
+;;;;
+
+(defmethod compute-effective-slot-reader ((class standard-class) slot)
+  (let ((slot-location (slot-definition-location slot)))
+    (check-type slot-location positive-fixnum)
+    (if (and (< slot-location (length *standard-effective-slot-readers*))
+	     (svref *standard-effective-slot-readers* slot-location))
+	(symbol-function (svref *standard-effective-slot-readers* slot-location))
+      (lambda (instance)
+	(unbound-protect (standard-instance-access instance slot-location)
+			 (slot-unbound-trampoline instance slot-location))))))
+
+(defmethod compute-effective-slot-reader ((class funcallable-standard-class) slot)
+  (let ((slot-location (slot-definition-location slot)))
+    (check-type slot-location positive-fixnum)
+    (lambda (instance)
+      (unbound-protect (svref (std-gf-instance-slots instance) slot-location)
+		       (slot-unbound-trampoline instance slot-location)))))
+
+(defmethod compute-effective-slot-writer ((class standard-class) slot)
+  (let ((slot-location (slot-definition-location slot)))
+    (check-type slot-location positive-fixnum)
+    (lambda (value instance)
+      (setf (standard-instance-access instance slot-location)
+	value))))
+
+(defmethod compute-effective-slot-writer ((class funcallable-standard-class) slot)
+  (let ((slot-location (slot-definition-location slot)))
+    (check-type slot-location positive-fixnum)
+    (lambda (value instance)
+      (setf (svref (std-gf-instance-slots instance) slot-location)
+	value))))
+
+
+
 ;;; compute-applicable-methods-using-classes
 
 (defun std-compute-applicable-methods-using-classes (gf classes)
@@ -1560,8 +1594,12 @@
 							      *standard-slot-value-using-class*)
 							    (class-of object) object
 							    (accessor-method-slot-definition primary-method))))))
-	      (compute-effective-slot-reader (specializer-class (car specializers))
-					     (accessor-method-slot-definition primary-method)))
+	      (let* ((class (specializer-class (car specializers)))
+		     (slot (find-slot class
+				      (slot-definition-name
+				       (accessor-method-slot-definition primary-method))
+				      t)))
+		(compute-effective-slot-reader class slot)))
 	     ((and (typep primary-method 'standard-writer-method)
 		   ;; May we shortcut this writer method?
 		   (or (not *standard-setf-slot-value-using-class*) ; still bootstrapping..
@@ -1573,8 +1611,12 @@
 							      *standard-setf-slot-value-using-class*)
 							    value (class-of object) object
 							    (accessor-method-slot-definition primary-method))))))
-	      (compute-effective-slot-writer (specializer-class (cadr specializers))
-					     (accessor-method-slot-definition primary-method)))
+	      (let* ((class (specializer-class (cadr specializers)))
+		     (slot (find-slot class
+				      (slot-definition-name
+				       (accessor-method-slot-definition primary-method))
+				      t)))
+		(compute-effective-slot-writer class slot)))
 	     (t (compute-primary-emfun primaries))))
 	   ((null reverse-afters)
 	    (let ((emfun (compute-primary-emfun primaries))
@@ -1901,32 +1943,3 @@
       (values))))
 
 
-;;;;
-
-(defclass run-time-context-class (std-slotted-class built-in-class) ())
-
-(defclass run-time-context (t)
-  ((name
-    :initarg :name
-    :accessor run-time-context-name)
-   (stack-vector
-    :initarg :stack-vector))
-  (:metaclass run-time-context-class)
-  (:size #.(bt:sizeof 'movitz::movitz-run-time-context))
-  (:slot-map #.(movitz::slot-map 'movitz::movitz-run-time-context
-			       (cl:+ (bt:slot-offset 'movitz::movitz-run-time-context
-						     'movitz::run-time-context-start)
-				     0))))
-
-(defmethod slot-value-using-class ((class run-time-context-class) object
-				   (slot standard-effective-slot-definition))
-  (let ((x (svref (%run-time-context-slot 'slots object)
-		  (slot-definition-location slot))))
-    (if (eq x (load-global-constant new-unbound-value))
-	(slot-unbound class object (slot-definition-name slot))
-      x)))
-
-(defmethod print-object ((x run-time-context) stream)
-  (print-unreadable-object (x stream :type t :identity t)
-    (format stream " ~S" (%run-time-context-slot 'name x)))
-  x)




More information about the Movitz-cvs mailing list