chiark / gitweb /
Make custom slot setting work again.
[clg] / gffi / virtual-slots.lisp
index 22a6af3ae3159725c5aad35a73931d8b71a59660..46e46cc2d86e04ef6acf141513ef55c43251cf46 100644 (file)
@@ -43,10 +43,10 @@ (defclass effective-virtual-slot-definition (standard-effective-slot-definition)
    (unbound :reader slot-definition-unbound :initarg :unbound)
    (boundp :reader slot-definition-boundp :initarg :boundp)
    (makunbound :reader slot-definition-makunbound :initarg :makunbound)
-   #+clisp(reader-function)
-   #+clisp(writer-function)
-   #+clisp(boundp-function)
+   reader-function
    makunbound-function
+   boundp-function
+   writer-function
    #+clisp(type :initarg :type :reader slot-definition-type)))
 
 (defclass direct-special-slot-definition (standard-direct-slot-definition)
@@ -290,23 +290,25 @@ (defmacro vsc-slot-x-using-class (x x-slot-name computer &key allow-string-fun-p
           (slotd effective-virtual-slot-definition))
        (unless (and (slot-boundp slotd ',x-slot-name)
                     ,@(when allow-string-fun-p
-                         `((not
-                            (stringp (slot-value slotd ',x-slot-name))))))
-         (setf (slot-value slotd ',x-slot-name) (,computer slotd)))
+                            `((not (stringp (slot-value slotd ',x-slot-name))))))
+         (let ((computed (,computer slotd)))
+           (setf (slot-value slotd ',x-slot-name) computed)))
        (funcall (slot-value slotd ',x-slot-name) object))))
 
-(vsc-slot-x-using-class value getter compute-slot-reader-function
-                        :allow-string-fun-p t)
+(vsc-slot-x-using-class value reader-function
+                        compute-slot-reader-function :allow-string-fun-p t)
 (vsc-slot-x-using-class boundp boundp-function compute-slot-boundp-function)
 (vsc-slot-x-using-class makunbound makunbound-function
                         compute-slot-makunbound-function)
 
-(defmethod (setf slot-value-using-class) (value (class virtual-slots-class)
-                                          (object virtual-slots-object)
-                                          (slotd effective-virtual-slot-definition))
-  (unless (slot-boundp slotd 'setter)
-    (setf (slot-value slotd 'setter) (compute-slot-writer-function slotd)))
-  (funcall (slot-value slotd 'setter) value object))
+(defmethod (setf slot-value-using-class)
+    (value
+     (class virtual-slots-class) (object virtual-slots-object)
+     (slotd effective-virtual-slot-definition))
+  (unless (slot-boundp slotd 'writer-function)
+    (setf (slot-value slotd 'writer-function)
+          (compute-slot-writer-function slotd)))
+  (funcall (slot-value slotd 'writer-function) value object))
 
 ;; In CLISP and SBCL (0.9.15 or newler) a class may not have been
 ;; finalized when update-slots are called. So to avoid the possibility