0.9.15.19:
[sbcl.git] / src / pcl / std-class.lisp
index 553e17d..8d9dde3 100644 (file)
 (defmethod ensure-class-using-class ((class null) name &rest args &key)
   (multiple-value-bind (meta initargs)
       (ensure-class-values class args)
-    #+nil
-    (set-class-type-translation (class-prototype meta) name)
     (setf class (apply #'make-instance meta :name name initargs))
     (without-package-locks
       (setf (find-class name) class))
                     (push old collect)))))
           (nreverse collect)))
   (add-direct-subclasses class direct-superclasses)
-  (update-class class nil)
-  (do* ((slots (slot-value class 'slots) (cdr slots))
-        (dupes nil))
-       ((null slots) (when dupes
-                       (style-warn
-                        ;; FIXME: the indentation request ("~4I")
-                        ;; below appears not to do anything.  Finding
-                        ;; out why would be nice.  -- CSR, 2003-04-24
-                        "~@<slot names with the same SYMBOL-NAME but ~
-                         different SYMBOL-PACKAGE (possible package problem) ~
-                         for class ~S:~@:_~4I~<~@{~S~^~:@_~}~:>~@:>"
-                        class
-                        dupes)))
-    (let* ((slot (car slots))
-           (oslots (remove (slot-definition-name slot) (cdr slots)
-                           :test #'string/= :key #'slot-definition-name)))
-      (when oslots
-        (pushnew (cons (slot-definition-name slot)
-                       (mapcar #'slot-definition-name oslots))
-                 dupes
-                 :test #'string= :key #'car))))
+  (if (class-finalized-p class)
+      ;; required by AMOP, "Reinitialization of Class Metaobjects"
+      (finalize-inheritance class)
+      (update-class class nil))
   (add-slot-accessors class direct-slots)
   (make-preliminary-layout class))
 
          ;; some class is forthcoming, because there are legitimate
          ;; questions one can ask of the type system, implemented in
          ;; terms of CLASSOIDs, involving forward-referenced classes. So.
-         (let ((classoid (or (let ((layout (slot-value class 'wrapper)))
-                               (when layout (layout-classoid layout)))
-                             #+nil
-                             (find-classoid name nil)
-                             (make-standard-classoid
-                              :name (if (symbolp name) name nil))))
-               (layout (make-wrapper 0 class)))
-           (setf (layout-classoid layout) classoid)
-           (setf (classoid-pcl-class classoid) class)
+         (let ((layout (make-wrapper 0 class)))
            (setf (slot-value class 'wrapper) layout)
            (let ((cpl (compute-preliminary-cpl class)))
              (setf (layout-inherits layout)
                     (map 'simple-vector #'class-wrapper
                          (reverse (rest cpl))))))
            (register-layout layout :invalidate t)
-           (setf (classoid-layout classoid) layout))))
+           (set-class-type-translation class (layout-classoid layout)))))
      (mapc #'make-preliminary-layout (class-direct-subclasses class)))))
 
 
 ;;; or reinitialized. The class may or may not be finalized.
 (defun update-class (class finalizep)
   (without-package-locks
-   (when (or finalizep (class-finalized-p class))
-     (update-cpl class (compute-class-precedence-list class))
-     ;; This invocation of UPDATE-SLOTS, in practice, finalizes the
-     ;; class.
-     (update-slots class (compute-slots class))
-     (update-gfs-of-class class)
-     (update-initargs class (compute-default-initargs class))
-     (update-ctors 'finalize-inheritance :class class))
-   (dolist (sub (class-direct-subclasses class))
-     (update-class sub nil))))
+    (when (or finalizep (class-finalized-p class))
+      (update-cpl class (compute-class-precedence-list class))
+      ;; This invocation of UPDATE-SLOTS, in practice, finalizes the
+      ;; class.
+      (update-slots class (compute-slots class))
+      (update-gfs-of-class class)
+      (update-initargs class (compute-default-initargs class))
+      (update-ctors 'finalize-inheritance :class class))
+    (dolist (sub (class-direct-subclasses class))
+      (update-class sub nil))))
 
 (define-condition cpl-protocol-violation (reference-condition error)
   ((class :initarg :class :reader cpl-protocol-violation-class)
               (wrapper-instance-slots-layout nwrapper) nlayout
               (wrapper-class-slots nwrapper) nwrapper-class-slots
               (wrapper-no-of-instance-slots nwrapper) nslots
-              wrapper nwrapper))
+              wrapper nwrapper)
+        (do* ((slots (slot-value class 'slots) (cdr slots))
+              (dupes nil))
+             ((null slots)
+              (when dupes
+                (style-warn
+                 "~@<slot names with the same SYMBOL-NAME but ~
+                  different SYMBOL-PACKAGE (possible package problem) ~
+                  for class ~S:~4I~@:_~<~@{~S~^~:@_~}~:>~@:>"
+                  class dupes)))
+          (let* ((slot (car slots))
+                 (oslots (remove (slot-definition-name slot) (cdr slots)
+                                 :test #'string/=
+                                 :key #'slot-definition-name)))
+            (when oslots
+              (pushnew (cons (slot-definition-name slot)
+                             (mapcar #'slot-definition-name oslots))
+                       dupes
+                       :test #'string= :key #'car)))))
       (setf (slot-value class 'finalized-p) t)
       (unless (eq owrapper nwrapper)
         (update-pv-table-cache-info class)
                              (list class)
                              (make-reader-method-function class slot-name)
                              "automatically generated reader method"
-                             slot-name)))
+                             :slot-name slot-name
+                             :object-class class
+                             :method-class-function #'reader-method-class)))
 
 (defmethod writer-method-class ((class slot-class) direct-slot &rest initargs)
   (declare (ignore direct-slot initargs))
                              (list *the-class-t* class)
                              (make-writer-method-function class slot-name)
                              "automatically generated writer method"
-                             slot-name)))
+                             :slot-name slot-name
+                             :object-class class
+                             :method-class-function #'writer-method-class)))
 
 (defmethod add-boundp-method ((class slot-class) generic-function slot-name)
   (add-method generic-function
-              (make-a-method 'standard-boundp-method
+              (make-a-method (constantly (find-class 'standard-boundp-method))
+                             class
                              ()
                              (list (or (class-name class) 'object))
                              (list class)