- (type-number (find-type-number type)))
- (when (and (not (slot-boundp slotd 'getter)) (slot-readable-p slotd))
- (setf
- (slot-value slotd 'getter)
- (let ((reader nil))
- #'(lambda (object)
- (unless reader
- (setq reader (reader-function (type-from-number type-number))))
- (let ((gvalue (gvalue-new type-number)))
- (%object-get-property object pname gvalue)
- (unwind-protect
- (funcall reader gvalue +gvalue-value-offset+)
- (gvalue-free gvalue t)))))))
-
- (when (and (not (slot-boundp slotd 'setter)) (slot-writable-p slotd))
- (setf
- (slot-value slotd 'setter)
- (let ((writer nil))
- #'(lambda (value object)
- (unless writer
- (setq writer (writer-function (type-from-number type-number))))
- (let ((gvalue (gvalue-new type-number)))
- (funcall writer value gvalue +gvalue-value-offset+)
- (%object-set-property object pname gvalue)
- (gvalue-free gvalue t)
- value))))))
-
- (call-next-method))
+ (reader (reader-function type :ref :get)))
+ #'(lambda (object)
+ (with-memory (gvalue +gvalue-size+)
+ (%gvalue-init gvalue (find-type-number type))
+ (%object-get-property object pname gvalue)
+ (funcall reader gvalue +gvalue-value-offset+)))))
+
+(defmethod compute-slot-writer-function :around ((slotd effective-property-slot-definition))
+ (if (construct-only-property-p slotd)
+ #'(lambda (value object)
+ (declare (ignore value object))
+ (unless *ignore-setting-construct-only-property*
+ (error 'unwritable-slot :name (slot-definition-name slotd) :instance object)))
+ (call-next-method)))
+
+(defmethod compute-slot-writer-function ((slotd effective-property-slot-definition))
+ (let* ((type (slot-definition-type slotd))
+ (pname (slot-definition-pname slotd))
+ (writer (writer-function type :temp t))
+ (destroy (destroy-function type :temp t)))
+ #'(lambda (value object)
+ (with-memory (gvalue +gvalue-size+)
+ (%gvalue-init gvalue (find-type-number type))
+ (funcall writer value gvalue +gvalue-value-offset+)
+ (%object-set-property object pname gvalue)
+ (funcall destroy gvalue +gvalue-value-offset+))
+ value)))
+
+(defmethod slot-readable-p ((slotd effective-user-data-slot-definition))
+ (declare (ignore slotd))
+ t)
+
+(defmethod compute-slot-reader-function ((slotd effective-user-data-slot-definition) &optional signal-unbound-p)
+ (declare (ignore signal-unbound-p))
+ (let ((slot-name (slot-definition-name slotd)))
+ #'(lambda (object)
+ (user-data object slot-name))))
+
+(defmethod compute-slot-boundp-function ((slotd effective-user-data-slot-definition))
+ (let ((slot-name (slot-definition-name slotd)))
+ #'(lambda (object)
+ (user-data-p object slot-name))))
+
+(defmethod slot-writable-p ((slotd effective-user-data-slot-definition))
+ (declare (ignore slotd))
+ t)
+
+(defmethod compute-slot-writer-function ((slotd effective-user-data-slot-definition))
+ (let ((slot-name (slot-definition-name slotd)))
+ #'(lambda (value object)
+ (setf (user-data object slot-name) value))))
+
+(defmethod compute-slot-makunbound-function ((slotd effective-user-data-slot-definition))
+ (let ((slot-name (slot-definition-name slotd)))
+ #'(lambda (object)
+ (unset-user-data object slot-name))))
+
+(defmethod compute-slots :around ((class gobject-class))
+ (let ((slots (call-next-method)))
+ (when (some #'(lambda (slotd)
+ (and
+ (eq (slot-definition-allocation slotd) :instance)
+ (not (typep slotd 'effective-special-slot-definition))))
+ slots)
+ (setf (slot-value class 'instance-slots-p) t))
+ slots))