X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fpcl%2Flow.lisp;h=2a333d0d68cf47d25edd1401a40f89002d8b467d;hb=f17e3d27d7ff599f9443d011d17017a2a858c81a;hp=9de576360eac270de4bd1886243cc1bc33c0523f;hpb=1ca4f69009204caee2484161e6eb89fa6c5fd3f6;p=sbcl.git diff --git a/src/pcl/low.lisp b/src/pcl/low.lisp index 9de5763..2a333d0 100644 --- a/src/pcl/low.lisp +++ b/src/pcl/low.lisp @@ -173,17 +173,20 @@ ;;; this an interned symbol. That means that the fast check to see ;;; whether a slot is unbound is to say (EQ '..SLOT-UNBOUND..). ;;; That is considerably faster than looking at the value of a special -;;; variable. Be careful, there are places in the code which actually -;;; use ..SLOT-UNBOUND.. rather than this variable. So much for -;;; modularity.. +;;; variable. ;;; -;;; FIXME: Now that we're tightly integrated into SBCL, we could use -;;; the SBCL built-in unbound value token instead. Perhaps if we did -;;; so it would be a good idea to define collections of CLOS slots as -;;; a new type of heap object, instead of using bare SIMPLE-VECTOR, in -;;; order to avoid problems (in the debugger if nowhere else) with -;;; SIMPLE-VECTORs some of whose elements are unbound tokens. -(defconstant +slot-unbound+ '..slot-unbound..) +;;; It seems only reasonable to also export this for users, since +;;; otherwise dealing with STANDARD-INSTANCE-ACCESS becomes harder +;;; -- and slower -- than it needs to be. +(defconstant +slot-unbound+ '..slot-unbound.. + "SBCL specific extentions to MOP: if this value is read from an +instance using STANDARD-INSTANCE-ACCESS, the slot is unbound. +Similarly, an :INSTANCE allocated slot can be made unbound by +assigning this to it using (SETF STANDARD-INSTANCE-ACCESS). + +Value of +SLOT-UNBOUND+ is unspecified, and should not be relied to be +of any particular type, but it is guaranteed to be suitable for EQ +comparison.") (defmacro %allocate-static-slot-storage--class (no-of-slots) `(make-array ,no-of-slots :initial-element +slot-unbound+)) @@ -348,6 +351,12 @@ (member (dsd-name included-slot) slot-overrides :test #'eq)) collect slot))))) +(defun uninitialized-accessor-function (type slotd) + (lambda (&rest args) + (declare (ignore args)) + (error "~:(~A~) function~@[ for ~S ~] not yet initialized." + type slotd))) + (defun structure-slotd-name (slotd) (dsd-name slotd)) @@ -355,13 +364,19 @@ (dsd-accessor-name slotd)) (defun structure-slotd-reader-function (slotd) - (fdefinition (dsd-accessor-name slotd))) + (let ((name (dsd-accessor-name slotd))) + (if (fboundp name) + (fdefinition name) + (uninitialized-accessor-function :reader slotd)))) (defun structure-slotd-writer-function (type slotd) (if (dsd-read-only slotd) (let ((dd (find-defstruct-description type))) (coerce (slot-setter-lambda-form dd slotd) 'function)) - (fdefinition `(setf ,(dsd-accessor-name slotd))))) + (let ((name `(setf ,(dsd-accessor-name slotd)))) + (if (fboundp name) + (fdefinition name) + (uninitialized-accessor-function :writer slotd))))) (defun structure-slotd-type (slotd) (dsd-type slotd))