(declaim (ftype (sfunction (t symbol) t) slot-value))
(defun slot-value (object slot-name)
- (let* ((class (check-obsolete-instance/class-of object))
- (cell (find-slot-cell class slot-name))
+ (let* ((wrapper (valid-wrapper-of object))
+ (cell (find-slot-cell wrapper slot-name))
(location (car cell))
(value
(cond ((fixnump location)
(funcallable-standard-instance-access object location)))
((consp location)
(cdr location))
- ((eq t location)
- (return-from slot-value
- (slot-value-using-class class object (cddr cell))))
((not cell)
(return-from slot-value
- (values (slot-missing class object slot-name 'slot-value))))
+ (values (slot-missing (wrapper-class* wrapper) object slot-name
+ 'slot-value))))
+ ((not location)
+ (return-from slot-value
+ (slot-value-using-class (wrapper-class* wrapper) object (cddr cell))))
(t
(bug "Bogus slot cell in SLOT-VALUE: ~S" cell)))))
(if (eq +slot-unbound+ value)
- (slot-unbound class object slot-name)
+ (slot-unbound (wrapper-class* wrapper) object slot-name)
value)))
(define-compiler-macro slot-value (&whole form object slot-name
form))
(defun set-slot-value (object slot-name new-value)
- (let* ((class (check-obsolete-instance/class-of object))
- (cell (find-slot-cell class slot-name))
+ (let* ((wrapper (valid-wrapper-of object))
+ (cell (find-slot-cell wrapper slot-name))
(location (car cell))
(type-check-function (cadr cell)))
(when type-check-function
new-value)))
((consp location)
(setf (cdr location) new-value))
- ((eq t location)
- (setf (slot-value-using-class class object (cddr cell)) new-value))
((not cell)
- (slot-missing class object slot-name 'setf new-value))
+ (slot-missing (wrapper-class* wrapper) object slot-name 'setf new-value))
+ ((not location)
+ (setf (slot-value-using-class (wrapper-class* wrapper) object (cddr cell))
+ new-value))
(t
(bug "Bogus slot-cell in SET-SLOT-VALUE: ~S" cell))))
new-value)
form))
(defun slot-boundp (object slot-name)
- (let* ((class (check-obsolete-instance/class-of object))
- (cell (find-slot-cell class slot-name))
+ (let* ((wrapper (valid-wrapper-of object))
+ (cell (find-slot-cell wrapper slot-name))
(location (car cell))
(value
(cond ((fixnump location)
(funcallable-standard-instance-access object location)))
((consp location)
(cdr location))
- ((eq t location)
- (return-from slot-boundp
- (slot-boundp-using-class class object (cddr cell))))
((not cell)
(return-from slot-boundp
- (and (slot-missing class object slot-name 'slot-boundp) t)))
+ (and (slot-missing (wrapper-class* wrapper) object slot-name
+ 'slot-boundp)
+ t)))
+ ((not location)
+ (return-from slot-boundp
+ (slot-boundp-using-class (wrapper-class* wrapper) object (cddr cell))))
(t
(bug "Bogus slot cell in SLOT-VALUE: ~S" cell)))))
(not (eq +slot-unbound+ value))))
form))
(defun slot-makunbound (object slot-name)
- (let* ((class (check-obsolete-instance/class-of object))
- (cell (find-slot-cell class slot-name))
+ (let* ((wrapper (valid-wrapper-of object))
+ (cell (find-slot-cell wrapper slot-name))
(location (car cell)))
(cond ((fixnump location)
(if (std-instance-p object)
+slot-unbound+)))
((consp location)
(setf (cdr location) +slot-unbound+))
- ((eq t location)
- (slot-makunbound-using-class class object (cddr cell)))
((not cell)
- (slot-missing class object slot-name 'slot-makunbound))
+ (slot-missing (wrapper-class* wrapper) object slot-name 'slot-makunbound))
+ ((not location)
+ (slot-makunbound-using-class (wrapper-class* wrapper) object (cddr cell)))
(t
(bug "Bogus slot-cell in SLOT-MAKUNBOUND: ~S" cell))))
object)
(let* ((function (slot-definition-internal-reader-function slotd))
(value (funcall function object)))
(declare (type function function))
+ ;; FIXME: Is this really necessary? Structure slots should surely
+ ;; never be unbound!
(if (eq value +slot-unbound+)
(values (slot-unbound class object (slot-definition-name slotd)))
value)))
(declare (ignore initargs))
(error "Cannot allocate an instance of ~S." class)) ; So sayeth AMOP
+;;; AMOP says that CLASS-SLOTS signals an error for unfinalized classes.
+(defmethod class-slots :before ((class slot-class))
+ (unless (class-finalized-p class)
+ (error 'simple-reference-error
+ :format-control "~S called on ~S, which is not yet finalized."
+ :format-arguments (list 'class-slots class)
+ :references (list '(:amop :generic-function class-slots)))))