- (etypecase index
- (fixnum (if fsc-p
- (lambda (class instance slotd)
- (declare (ignore slotd))
- (check-obsolete-instance instance)
- (let ((value (clos-slots-ref (fsc-instance-slots instance)
- index)))
- (if (eq value +slot-unbound+)
- (values (slot-unbound class instance slot-name))
- value)))
- (lambda (class instance slotd)
- (declare (ignore slotd))
- (check-obsolete-instance instance)
- (let ((value (clos-slots-ref (std-instance-slots instance)
- index)))
- (if (eq value +slot-unbound+)
- (values (slot-unbound class instance slot-name))
- value)))))
- (cons (lambda (class instance slotd)
- (declare (ignore slotd))
- (check-obsolete-instance instance)
- (let ((value (cdr index)))
- (if (eq value +slot-unbound+)
- (values (slot-unbound class instance slot-name))
- value))))
- (null
- (lambda (class instance slotd)
- ;; FIXME: MOP-ERROR
- (error "Standard ~S method called on arguments ~S."
- 'slot-value-using-class (list class instance slotd))))))
+ (let ((location (slot-definition-location slotd))
+ (slot-name (slot-definition-name slotd)))
+ (etypecase location
+ (fixnum (if fsc-p
+ (lambda (class instance slotd)
+ (declare (ignore slotd))
+ (check-obsolete-instance instance)
+ (let ((value (clos-slots-ref (fsc-instance-slots instance)
+ location)))
+ (if (eq value +slot-unbound+)
+ (values (slot-unbound class instance slot-name))
+ value)))
+ (lambda (class instance slotd)
+ (declare (ignore slotd))
+ (check-obsolete-instance instance)
+ (let ((value (clos-slots-ref (std-instance-slots instance)
+ location)))
+ (if (eq value +slot-unbound+)
+ (values (slot-unbound class instance slot-name))
+ value)))))
+ (cons (lambda (class instance slotd)
+ (declare (ignore slotd))
+ (check-obsolete-instance instance)
+ (let ((value (cdr location)))
+ (if (eq value +slot-unbound+)
+ (values (slot-unbound class instance slot-name))
+ value))))
+ (null
+ (lambda (class instance slotd)
+ (declare (ignore class instance))
+ (instance-structure-protocol-error slotd 'slot-value-using-class))))))