0.8.12.7: Merge package locks, AKA "what can go wrong with a 3783 line patch?"
[sbcl.git] / src / pcl / init.lisp
index 5fe2982..236fc86 100644 (file)
             (loop for slotd in (class-slots class)
                   unless (initialize-slot-from-initarg class instance slotd)
                     collect slotd)))
-      (loop for slotd in initfn-slotds
-            when (and (not (eq :class (slot-definition-allocation slotd)))
-                      (or (eq t slot-names)
-                          (memq (slot-definition-name slotd) slot-names))) do
-              (initialize-slot-from-initfunction class instance slotd)))
+      (dolist (slotd initfn-slotds)
+       (if (eq (slot-definition-allocation slotd) :class)
+           (when (or (eq t slot-names)
+                     (memq (slot-definition-name slotd) slot-names))
+             (unless (slot-boundp-using-class class instance slotd)
+               (initialize-slot-from-initfunction class instance slotd)))
+           (when (or (eq t slot-names)
+                     (memq (slot-definition-name slotd) slot-names))
+             (initialize-slot-from-initfunction class instance slotd)))))
     instance))
 \f
 ;;; If initargs are valid return nil, otherwise signal an error.
       ;; Now check the supplied-initarg-names and the default initargs
       ;; against the total set that we know are legal.
       (doplist (key val) initargs
-       (unless (memq key legal)
+       (unless (or (memq key legal)
+                   ;; :ALLOW-OTHER-KEYS NIL gets here
+                   (eq key :allow-other-keys))
          (push key invalid-keys)))
       (when (and invalid-keys error-p)
        (error 'initarg-error :class class :initargs invalid-keys)))