chiark / gitweb /
Make custom slot setting work again.
[clg] / gffi / virtual-slots.lisp
index 66f547f7ff4614a66770924ea2da9bb99861efa3..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)
@@ -282,27 +282,33 @@ (defmethod compute-effective-slot-definition-initargs ((class virtual-slots-clas
      (append '(:special t) (call-next-method)))
     (t (call-next-method))))
 
-(defmacro vsc-slot-x-using-class (x x-slot-name computer)
+(defmacro vsc-slot-x-using-class (x x-slot-name computer &key allow-string-fun-p)
   (let ((generic-name (intern (concatenate 'string
                                            "SLOT-" (string x) "-USING-CLASS"))))
     `(defmethod ,generic-name
          ((class virtual-slots-class) (object virtual-slots-object)
           (slotd effective-virtual-slot-definition))
-       (unless (slot-boundp slotd ',x-slot-name)
-         (setf (slot-value slotd ',x-slot-name) (,computer slotd)))
+       (unless (and (slot-boundp slotd ',x-slot-name)
+                    ,@(when allow-string-fun-p
+                            `((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)
+(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