(the fixnum (logand (the fixnum (lognot mask)) flags)))))
value)
-(defmethod initialize-internal-slot-functions ((slotd
- effective-slot-definition))
+(defmethod initialize-internal-slot-functions
+ ((slotd effective-slot-definition))
(let* ((name (slot-value slotd 'name))
(class (slot-value slotd '%class)))
(dolist (type '(reader writer boundp))
(writer '(setf slot-value-using-class))
(boundp 'slot-boundp-using-class)))
(gf (gdefinition gf-name)))
+ ;; KLUDGE: this logic is cut'n'pasted from
+ ;; GET-ACCESSOR-METHOD-FUNCTION, which (for STD-CLASSes) is
+ ;; only called later, because it does things that can't be
+ ;; computed this early in class finalization; however, we need
+ ;; this bit as early as possible. -- CSR, 2009-11-05
+ (setf (slot-accessor-std-p slotd type)
+ (let* ((std-method (standard-svuc-method type))
+ (str-method (structure-svuc-method type))
+ (types1 `((eql ,class) (class-eq ,class) (eql ,slotd)))
+ (types (if (eq type 'writer) `(t ,@types1) types1))
+ (methods (compute-applicable-methods-using-types gf types)))
+ (null (cdr methods))))
+ (setf (slot-accessor-function slotd type)
+ (lambda (&rest args)
+ ;; FIXME: a tiny amount of wasted SLOT-ACCESSOR-STD-P
+ ;; work here (see KLUDGE comment above).
+ (let ((fun (compute-slot-accessor-info slotd type gf)))
+ (apply fun args))))))))
+
+(defmethod finalize-internal-slot-functions ((slotd effective-slot-definition))
+ (let* ((name (slot-value slotd 'name)))
+ (dolist (type '(reader writer boundp))
+ (let* ((gf-name (ecase type
+ (reader 'slot-value-using-class)
+ (writer '(setf slot-value-using-class))
+ (boundp 'slot-boundp-using-class)))
+ (gf (gdefinition gf-name)))
(compute-slot-accessor-info slotd type gf)))))
;;; CMUCL (Gerd PCL 2003-04-25) comment:
(defmethod compute-slot-accessor-info ((slotd effective-slot-definition)
type gf)
(let* ((name (slot-value slotd 'name))
- (class (slot-value slotd '%class))
- (old-slotd (when (class-finalized-p class)
- (find-slot-definition class name)))
- (old-std-p (and old-slotd (slot-accessor-std-p old-slotd 'all))))
+ (class (slot-value slotd '%class)))
(multiple-value-bind (function std-p)
- (if (eq *boot-state* 'complete)
+ (if (eq **boot-state** 'complete)
(get-accessor-method-function gf type class slotd)
(get-optimized-std-accessor-method-function class slotd type))
(setf (slot-accessor-std-p slotd type) std-p)
(defmethod add-direct-method :around ((specializer specializer) method)
;; All the actions done under this lock are done in an order
;; that is safe to unwind at any point.
- (sb-thread::with-recursive-spinlock (*specializer-lock*)
+ (sb-thread::with-recursive-system-spinlock (*specializer-lock*)
(call-next-method)))
(defmethod remove-direct-method :around ((specializer specializer) method)
;; All the actions done under this lock are done in an order
;; that is safe to unwind at any point.
- (sb-thread::with-recursive-spinlock (*specializer-lock*)
+ (sb-thread::with-recursive-system-spinlock (*specializer-lock*)
(call-next-method)))
(defmethod add-direct-method ((specializer class) (method method))
(without-package-locks
(setf (find-class name) class))))
;; After boot (SETF FIND-CLASS) does this.
- (unless (eq *boot-state* 'complete)
+ (unless (eq **boot-state** 'complete)
(%set-class-type-translation class name))
class)
(without-package-locks
(setf (find-class name) class))))
;; After boot (SETF FIND-CLASS) does this.
- (unless (eq *boot-state* 'complete)
+ (unless (eq **boot-state** 'complete)
(%set-class-type-translation class name))
class)
(defmethod compute-slots :around ((class condition-class))
(let ((eslotds (call-next-method)))
- (mapc #'initialize-internal-slot-functions eslotds)
+ (mapc #'finalize-internal-slot-functions eslotds)
eslotds))
(defmethod shared-initialize :after
(defun make-structure-class-defstruct-form (name direct-slots include)
(let* ((conc-name (format-symbol *package* "~S structure class " name))
(constructor (format-symbol *package* "~Aconstructor" conc-name))
- (defstruct `(defstruct (,name
- ,@(when include
- `((:include ,(class-name include))))
- (:predicate nil)
- (:conc-name ,conc-name)
- (:constructor ,constructor ())
- (:copier nil))
- ,@(mapcar (lambda (slot)
- `(,(slot-definition-name slot)
- +slot-unbound+))
- direct-slots)))
- (reader-names (mapcar (lambda (slotd)
- (list 'slot-accessor name
- (slot-definition-name slotd)
- 'reader))
- direct-slots))
- (writer-names (mapcar (lambda (slotd)
- (list 'slot-accessor name
- (slot-definition-name slotd)
- 'writer))
- direct-slots))
- (readers-init
- (mapcar (lambda (slotd reader-name)
- (let ((accessor
+ (included-name (class-name include))
+ (included-slots
+ (when include
+ (mapcar #'dsd-name (dd-slots (find-defstruct-description included-name)))))
+ (old-slots nil)
+ (new-slots nil)
+ (reader-names nil)
+ (writer-names nil))
+ (dolist (slotd (reverse direct-slots))
+ (let* ((slot-name (slot-definition-name slotd))
+ (initform (slot-definition-initform slotd))
+ (type (slot-definition-type slotd))
+ (desc `(,slot-name ,initform :type ,type)))
+ (push `(slot-accessor ,name ,slot-name reader)
+ reader-names)
+ (push `(slot-accessor ,name ,slot-name writer)
+ writer-names)
+ (if (member slot-name included-slots :test #'eq)
+ (push desc old-slots)
+ (push desc new-slots))))
+ (let* ((defstruct `(defstruct (,name
+ ,@(when include
+ `((:include ,included-name
+ ,@old-slots)))
+ (:constructor ,constructor ())
+ (:predicate nil)
+ (:conc-name ,conc-name)
+ (:copier nil))
+ ,@new-slots))
+ (readers-init
+ (mapcar (lambda (slotd reader-name)
+ (let ((accessor
(slot-definition-defstruct-accessor-symbol
slotd)))
- `(defun ,reader-name (obj)
- (declare (type ,name obj))
- (,accessor obj))))
- direct-slots reader-names))
- (writers-init
- (mapcar (lambda (slotd writer-name)
- (let ((accessor
+ `(defun ,reader-name (obj)
+ (declare (type ,name obj))
+ (,accessor obj))))
+ direct-slots reader-names))
+ (writers-init
+ (mapcar (lambda (slotd writer-name)
+ (let ((accessor
(slot-definition-defstruct-accessor-symbol
slotd)))
- `(defun ,writer-name (nv obj)
- (declare (type ,name obj))
- (setf (,accessor obj) nv))))
- direct-slots writer-names))
- (defstruct-form
- `(progn
+ `(defun ,writer-name (nv obj)
+ (declare (type ,name obj))
+ (setf (,accessor obj) nv))))
+ direct-slots writer-names))
+ (defstruct-form
+ `(progn
,defstruct
,@readers-init ,@writers-init
(cons nil nil))))
- (values defstruct-form constructor reader-names writer-names)))
+ (values defstruct-form constructor reader-names writer-names))))
(defun make-defstruct-allocation-function (name)
;; FIXME: Why don't we go class->layout->info == dd
(style-warn
"~@<slot names with the same SYMBOL-NAME but ~
different SYMBOL-PACKAGE (possible package problem) ~
- for class ~S:~4I~@:_~<~@{~S~^~:@_~}~:>~@:>"
+ for class ~S:~4I~@:_~<~@{~/sb-impl::print-symbol-with-prefix/~^~:@_~}~:>~@:>"
class dupes)))
(let* ((slot (car slots))
(oslots (remove (slot-definition-name slot) (cdr slots)
(defmethod compute-slots :around ((class structure-class))
(let ((eslotds (call-next-method)))
- (mapc #'initialize-internal-slot-functions eslotds)
+ (mapc #'finalize-internal-slot-functions eslotds)
eslotds))
(defmethod compute-effective-slot-definition ((class slot-class) name dslotds)