Correctly sort out string-specified getters in virtual-slots.lisp
authorRupert Swarbrick <rswarbrick@gmail.com>
Wed, 29 Feb 2012 17:00:45 +0000 (17:00 +0000)
committerRupert Swarbrick <rswarbrick@gmail.com>
Wed, 29 Feb 2012 17:11:09 +0000 (17:11 +0000)
The new code basically just punts to the method on
compute-slot-reader-function defined in proxy.lisp.

gffi/virtual-slots.lisp

index 66f547f..22a6af3 100644 (file)
      (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)
+       (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)))
        (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 getter 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)