X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fpcl%2Fstd-class.lisp;h=975acc43bf1f12dd1be9cb5f869121e9e7aa13b6;hb=441dfe5655f1ec3ee96e7b17b7cb1c7a4a906117;hp=c1e6af30745220bff339d65a7573575ee1646e72;hpb=9c401e48bdf6abb5ec6ff574ca8cafb82fe0ba8a;p=sbcl.git diff --git a/src/pcl/std-class.lisp b/src/pcl/std-class.lisp index c1e6af3..975acc4 100644 --- a/src/pcl/std-class.lisp +++ b/src/pcl/std-class.lisp @@ -567,18 +567,22 @@ &key direct-slots direct-superclasses) (declare (ignore slot-names)) (let ((classoid (find-classoid (slot-value class 'name)))) - (with-slots (wrapper %class-precedence-list cpl-available-p - prototype (direct-supers direct-superclasses)) + (with-slots (wrapper + %class-precedence-list cpl-available-p finalized-p + prototype (direct-supers direct-superclasses) + plist) class (setf (slot-value class 'direct-slots) (mapcar (lambda (pl) (make-direct-slotd class pl)) - direct-slots)) - (setf (slot-value class 'finalized-p) t) - (setf (classoid-pcl-class classoid) class) - (setq direct-supers direct-superclasses) - (setq wrapper (classoid-layout classoid)) - (setq %class-precedence-list (compute-class-precedence-list class)) - (setq cpl-available-p t) + direct-slots) + finalized-p t + (classoid-pcl-class classoid) class + direct-supers direct-superclasses + wrapper (classoid-layout classoid) + %class-precedence-list (compute-class-precedence-list class) + cpl-available-p t + (getf plist 'direct-default-initargs) + (sb-kernel::condition-classoid-direct-default-initargs classoid)) (add-direct-subclasses class direct-superclasses) (let ((slots (compute-slots class))) (setf (slot-value class 'slots) slots) @@ -882,6 +886,19 @@ (find-class 'function) (cpl-protocol-violation-cpl c))))) +(defun class-has-a-cpl-protocol-violation-p (class) + (labels ((find-in-superclasses (class classes) + (cond + ((null classes) nil) + ((eql class (car classes)) t) + (t (find-in-superclasses class (append (class-direct-superclasses (car classes)) (cdr classes))))))) + (let ((metaclass (class-of class))) + (cond + ((eql metaclass *the-class-standard-class*) + (find-in-superclasses (find-class 'function) (list class))) + ((eql metaclass *the-class-funcallable-standard-class*) + (not (find-in-superclasses (find-class 'function) (list class)))))))) + (defun %update-cpl (class cpl) (when (eq (class-of class) *the-class-standard-class*) (when (find (find-class 'function) cpl)