X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fpcl%2Fstd-class.lisp;h=6b9f967dd870e48c1eb5c1d1cf819c042a331067;hb=f6a2be77637d025bfded9430f02863c28f74f77a;hp=206e2226c1577edf1b8565eed607072cdb821181;hpb=4eb1a6d3ad2b7dcc19ac0ec979a1eb1eb049659a;p=sbcl.git diff --git a/src/pcl/std-class.lisp b/src/pcl/std-class.lisp index 206e222..6b9f967 100644 --- a/src/pcl/std-class.lisp +++ b/src/pcl/std-class.lisp @@ -173,9 +173,6 @@ (defmethod class-default-initargs ((class slot-class)) (plist-value class 'default-initargs)) -(defmethod class-constructors ((class slot-class)) - (plist-value class 'constructors)) - (defmethod class-slot-cells ((class std-class)) (plist-value class 'class-slot-cells)) @@ -228,9 +225,12 @@ (with-slots (direct-methods) specializer (or (cdr direct-methods) (setf (cdr direct-methods) - (gathering1 (collecting-once) + (let (collect) (dolist (m (car direct-methods)) - (gather1 (method-generic-function m)))))))) + ;; the old PCL code used COLLECTING-ONCE which used + ;; #'EQ to check for newness + (pushnew (method-generic-function m) collect :test #'eq)) + (nreverse collect)))))) ;;; This hash table is used to store the direct methods and direct generic ;;; functions of EQL specializers. Each value in the table is the cons. @@ -276,32 +276,33 @@ (when entry (or (cdr entry) (setf (cdr entry) - (gathering1 (collecting-once) + (let (collect) (dolist (m (car entry)) - (gather1 (method-generic-function m))))))))) + (pushnew (method-generic-function m) collect :test #'eq)) + (nreverse collect))))))) (defun map-specializers (function) - (map-all-classes #'(lambda (class) - (funcall function (class-eq-specializer class)) - (funcall function class))) - (maphash #'(lambda (object methods) - (declare (ignore methods)) - (intern-eql-specializer object)) + (map-all-classes (lambda (class) + (funcall function (class-eq-specializer class)) + (funcall function class))) + (maphash (lambda (object methods) + (declare (ignore methods)) + (intern-eql-specializer object)) *eql-specializer-methods*) - (maphash #'(lambda (object specl) - (declare (ignore object)) - (funcall function specl)) + (maphash (lambda (object specl) + (declare (ignore object)) + (funcall function specl)) *eql-specializer-table*) nil) (defun map-all-generic-functions (function) (let ((all-generic-functions (make-hash-table :test 'eq))) - (map-specializers #'(lambda (specl) - (dolist (gf (specializer-direct-generic-functions - specl)) - (unless (gethash gf all-generic-functions) - (setf (gethash gf all-generic-functions) t) - (funcall function gf)))))) + (map-specializers (lambda (specl) + (dolist (gf (specializer-direct-generic-functions + specl)) + (unless (gethash gf all-generic-functions) + (setf (gethash gf all-generic-functions) t) + (funcall function gf)))))) nil) (defmethod shared-initialize :after ((specl class-eq-specializer) @@ -425,14 +426,16 @@ (setq direct-default-initargs (plist-value class 'direct-default-initargs))) (setf (plist-value class 'class-slot-cells) - (gathering1 (collecting) + (let (collect) (dolist (dslotd direct-slots) (when (eq (slot-definition-allocation dslotd) class) (let ((initfunction (slot-definition-initfunction dslotd))) - (gather1 (cons (slot-definition-name dslotd) + (push (cons (slot-definition-name dslotd) (if initfunction (funcall initfunction) - +slot-unbound+)))))))) + +slot-unbound+)) + collect)))) + (nreverse collect))) (setq predicate-name (if predicate-name-p (setf (slot-value class 'predicate-name) (car predicate-name)) @@ -461,8 +464,8 @@ &rest initargs &key) (map-dependents class - #'(lambda (dependent) - (apply #'update-dependent class dependent initargs)))) + (lambda (dependent) + (apply #'update-dependent class dependent initargs)))) (defmethod shared-initialize :after ((slotd standard-slot-definition) slot-names &key) @@ -553,17 +556,17 @@ (if direct-slots-p (setf (slot-value class 'direct-slots) (setq direct-slots - (mapcar #'(lambda (pl) - (when defstruct-p - (let* ((slot-name (getf pl :name)) - (acc-name - (format nil - "~S structure class ~A" - name slot-name)) - (accessor (intern acc-name))) - (setq pl (list* :defstruct-accessor-symbol - accessor pl)))) - (make-direct-slotd class pl)) + (mapcar (lambda (pl) + (when defstruct-p + (let* ((slot-name (getf pl :name)) + (acc-name + (format nil + "~S structure class ~A" + name slot-name)) + (accessor (intern acc-name))) + (setq pl (list* :defstruct-accessor-symbol + accessor pl)))) + (make-direct-slotd class pl)) direct-slots))) (setq direct-slots (slot-value class 'direct-slots))) (when defstruct-p @@ -571,14 +574,14 @@ (multiple-value-bind (defstruct-form constructor reader-names writer-names) (make-structure-class-defstruct-form name direct-slots include) (unless (structure-type-p name) (eval defstruct-form)) - (mapc #'(lambda (dslotd reader-name writer-name) - (let* ((reader (gdefinition reader-name)) - (writer (when (gboundp writer-name) - (gdefinition writer-name)))) - (setf (slot-value dslotd 'internal-reader-function) - reader) - (setf (slot-value dslotd 'internal-writer-function) - writer))) + (mapc (lambda (dslotd reader-name writer-name) + (let* ((reader (gdefinition reader-name)) + (writer (when (gboundp writer-name) + (gdefinition writer-name)))) + (setf (slot-value dslotd 'internal-reader-function) + reader) + (setf (slot-value dslotd 'internal-writer-function) + writer))) direct-slots reader-names writer-names) (setf (slot-value class 'defstruct-form) defstruct-form) (setf (slot-value class 'defstruct-constructor) constructor)))) @@ -703,9 +706,9 @@ (make-wrapper nslots class)) ((and (equal nlayout olayout) (not - (iterate ((o (list-elements owrapper-class-slots)) - (n (list-elements nwrapper-class-slots))) - (unless (eq (car o) (car n)) (return t))))) + (loop for o in owrapper-class-slots + for n in nwrapper-class-slots + do (unless (eq (car o) (car n)) (return t))))) owrapper) (t ;; This will initialize the new wrapper to have the @@ -728,18 +731,20 @@ (update-pv-table-cache-info class))))) (defun compute-class-slots (eslotds) - (gathering1 (collecting) + (let (collect) (dolist (eslotd eslotds) - (gather1 - (assoc (slot-definition-name eslotd) - (class-slot-cells (slot-definition-allocation eslotd))))))) + (push (assoc (slot-definition-name eslotd) + (class-slot-cells (slot-definition-allocation eslotd))) + collect)) + (nreverse collect))) (defun compute-layout (cpl instance-eslotds) (let* ((names - (gathering1 (collecting) + (let (collect) (dolist (eslotd instance-eslotds) (when (eq (slot-definition-allocation eslotd) :instance) - (gather1 (slot-definition-name eslotd)))))) + (push (slot-definition-name eslotd) collect))) + (nreverse collect))) (order ())) (labels ((rwalk (tail) (when tail @@ -766,9 +771,9 @@ (setf (gethash gf gf-table) t)) (mapc #'collect-gfs (class-direct-superclasses class)))) (collect-gfs class) - (maphash #'(lambda (gf ignore) - (declare (ignore ignore)) - (update-gf-dfun class gf)) + (maphash (lambda (gf ignore) + (declare (ignore ignore)) + (update-gf-dfun class gf)) gf-table))))) (defun update-inits (class inits) @@ -814,9 +819,9 @@ (if entry (push d (cdr entry)) (push (list name d) name-dslotds-alist)))))) - (mapcar #'(lambda (direct) - (compute-effective-slot-definition class - (nreverse (cdr direct)))) + (mapcar (lambda (direct) + (compute-effective-slot-definition class + (nreverse (cdr direct)))) name-dslotds-alist))) (defmethod compute-slots :around ((class std-class)) @@ -840,11 +845,11 @@ eslotds)) (defmethod compute-slots ((class structure-class)) - (mapcan #'(lambda (superclass) - (mapcar #'(lambda (dslotd) - (compute-effective-slot-definition class - (list dslotd))) - (class-direct-slots superclass))) + (mapcan (lambda (superclass) + (mapcar (lambda (dslotd) + (compute-effective-slot-definition class + (list dslotd))) + (class-direct-slots superclass))) (reverse (slot-value class 'class-precedence-list)))) (defmethod compute-slots :around ((class structure-class)) @@ -1035,7 +1040,7 @@ (sb-sys:without-interrupts (update-lisp-class-layout class nwrapper) (setf (slot-value class 'wrapper) nwrapper) - (invalidate-wrapper owrapper ':flush nwrapper)))))) + (invalidate-wrapper owrapper :flush nwrapper)))))) (defun flush-cache-trap (owrapper nwrapper instance) (declare (ignore owrapper)) @@ -1055,7 +1060,7 @@ (sb-sys:without-interrupts (update-lisp-class-layout class nwrapper) (setf (slot-value class 'wrapper) nwrapper) - (invalidate-wrapper owrapper ':obsolete nwrapper) + (invalidate-wrapper owrapper :obsolete nwrapper) class))) (defmethod make-instances-obsolete ((class symbol)) @@ -1126,19 +1131,20 @@ ;; -- --> shared -- ;; Go through all the old local slots. - (iterate ((name (list-elements olayout)) - (opos (interval :from 0))) - (let ((npos (posq name nlayout))) - (if npos - (setf (clos-slots-ref nslots npos) - (clos-slots-ref oslots opos)) - (progn - (push name discarded) - (unless (eq (clos-slots-ref oslots opos) +slot-unbound+) - (setf (getf plist name) (clos-slots-ref oslots opos))))))) + (let ((opos 0)) + (dolist (name olayout) + (let ((npos (posq name nlayout))) + (if npos + (setf (clos-slots-ref nslots npos) + (clos-slots-ref oslots opos)) + (progn + (push name discarded) + (unless (eq (clos-slots-ref oslots opos) +slot-unbound+) + (setf (getf plist name) (clos-slots-ref oslots opos)))))) + (incf opos))) ;; Go through all the old shared slots. - (iterate ((oclass-slot-and-val (list-elements oclass-slots))) + (dolist (oclass-slot-and-val oclass-slots) (let ((name (car oclass-slot-and-val)) (val (cdr oclass-slot-and-val))) (let ((npos (posq name nlayout))) @@ -1187,16 +1193,16 @@ ;; "The values of local slots specified by both the class CTO and ;; CFROM are retained. If such a local slot was unbound, it ;; remains unbound." - (iterate ((new-slot (list-elements new-layout)) - (new-position (interval :from 0))) - (let ((old-position (posq new-slot old-layout))) - (when old-position - (setf (clos-slots-ref new-slots new-position) - (clos-slots-ref old-slots old-position))))) + (let ((new-position 0)) + (dolist (new-slot new-layout) + (let ((old-position (posq new-slot old-layout))) + (when old-position + (setf (clos-slots-ref new-slots new-position) + (clos-slots-ref old-slots old-position)))))) ;; "The values of slots specified as shared in the class CFROM and ;; as local in the class CTO are retained." - (iterate ((slot-and-val (list-elements old-class-slots))) + (dolist (slot-and-val old-class-slots) (let ((position (posq (car slot-and-val) new-layout))) (when position (setf (clos-slots-ref new-slots position) (cdr slot-and-val)))))