X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fpcl%2Fslots.lisp;h=24de706eaf1eafa918df73e7db6b9a45903cb723;hb=5e291412ff095a2016388eee8ac265e12d565119;hp=2c058c035d0f52eefa75f47c8b8c55c40d368b22;hpb=937a46e64983862cb9e21761db95e58700341940;p=sbcl.git diff --git a/src/pcl/slots.lisp b/src/pcl/slots.lisp index 2c058c0..24de706 100644 --- a/src/pcl/slots.lisp +++ b/src/pcl/slots.lisp @@ -80,6 +80,7 @@ (when (eql slot-name (slot-definition-name slot)) (return slot)))) +(declaim (ftype (sfunction (t symbol) t) slot-value)) (defun slot-value (object slot-name) (let* ((class (class-of object)) (slot-definition (find-slot-definition class slot-name))) @@ -153,22 +154,22 @@ (slotd standard-effective-slot-definition)) (check-obsolete-instance object) (let* ((location (slot-definition-location slotd)) - (value (typecase location - (fixnum - (cond ((std-instance-p object) - (clos-slots-ref (std-instance-slots object) - location)) - ((fsc-instance-p object) - (clos-slots-ref (fsc-instance-slots object) - location)) - (t (error "unrecognized instance type")))) - (cons - (cdr location)) - (t - (error "~@" - slotd 'slot-value-using-class))))) + (value + (typecase location + (fixnum + (cond ((std-instance-p object) + (clos-slots-ref (std-instance-slots object) + location)) + ((fsc-instance-p object) + (clos-slots-ref (fsc-instance-slots object) + location)) + (t (bug "unrecognized instance type in ~S" + 'slot-value-using-class)))) + (cons + (cdr location)) + (t + (instance-structure-protocol-error slotd + 'slot-value-using-class))))) (if (eq value +slot-unbound+) (values (slot-unbound class object (slot-definition-name slotd))) value))) @@ -187,13 +188,13 @@ ((fsc-instance-p object) (setf (clos-slots-ref (fsc-instance-slots object) location) new-value)) - (t (error "unrecognized instance type")))) + (t (bug "unrecognized instance type in ~S" + '(setf slot-value-using-class))))) (cons (setf (cdr location) new-value)) (t - (error "~@" - slotd '(setf slot-value-using-class)))))) + (instance-structure-protocol-error slotd + '(setf slot-value-using-class)))))) (defmethod slot-boundp-using-class ((class std-class) @@ -201,22 +202,22 @@ (slotd standard-effective-slot-definition)) (check-obsolete-instance object) (let* ((location (slot-definition-location slotd)) - (value (typecase location - (fixnum - (cond ((std-instance-p object) + (value + (typecase location + (fixnum + (cond ((std-instance-p object) (clos-slots-ref (std-instance-slots object) location)) - ((fsc-instance-p object) - (clos-slots-ref (fsc-instance-slots object) - location)) - (t (error "unrecognized instance type")))) - (cons - (cdr location)) - (t - (error "~@" - slotd 'slot-boundp-using-class))))) + ((fsc-instance-p object) + (clos-slots-ref (fsc-instance-slots object) + location)) + (t (bug "unrecognized instance type in ~S" + 'slot-boundp-using-class)))) + (cons + (cdr location)) + (t + (instance-structure-protocol-error slotd + 'slot-boundp-using-class))))) (not (eq value +slot-unbound+)))) (defmethod slot-makunbound-using-class @@ -233,13 +234,13 @@ ((fsc-instance-p object) (setf (clos-slots-ref (fsc-instance-slots object) location) +slot-unbound+)) - (t (error "unrecognized instance type")))) + (t (bug "unrecognized instance type in ~S" + 'slot-makunbound-using-class)))) (cons (setf (cdr location) +slot-unbound+)) (t - (error "~@" - slotd 'slot-makunbound-using-class)))) + (instance-structure-protocol-error slotd + 'slot-makunbound-using-class)))) object) (defmethod slot-value-using-class @@ -279,7 +280,7 @@ (value (funcall function object))) (declare (type function function)) (if (eq value +slot-unbound+) - (slot-unbound class object (slot-definition-name slotd)) + (values (slot-unbound class object (slot-definition-name slotd))) value))) (defmethod (setf slot-value-using-class) @@ -330,9 +331,13 @@ (cons (car position)))))) +;;; FIXME: AMOP says that allocate-instance imples finalize-inheritance +;;; if the class is not yet finalized, but we don't seem to be taking +;;; care of this for non-standard-classes.x (defmethod allocate-instance ((class standard-class) &rest initargs) (declare (ignore initargs)) - (unless (class-finalized-p class) (finalize-inheritance class)) + (unless (class-finalized-p class) + (finalize-inheritance class)) (allocate-standard-instance (class-wrapper class))) (defmethod allocate-instance ((class structure-class) &rest initargs) @@ -340,8 +345,14 @@ (let ((constructor (class-defstruct-constructor class))) (if constructor (funcall constructor) - (error "can't allocate an instance of class ~S" (class-name class))))) + (allocate-standard-instance (class-wrapper class))))) +;;; FIXME: It would be nicer to have allocate-instance return +;;; uninitialized objects for conditions as well. (defmethod allocate-instance ((class condition-class) &rest initargs) (declare (ignore initargs)) (make-condition (class-name class))) + +(defmethod allocate-instance ((class built-in-class) &rest initargs) + (declare (ignore initargs)) + (error "Cannot allocate an instance of ~S." class)) ; So sayeth AMOP