0.8.18.3:
authorChristophe Rhodes <csr21@cam.ac.uk>
Fri, 31 Dec 2004 08:25:04 +0000 (08:25 +0000)
committerChristophe Rhodes <csr21@cam.ac.uk>
Fri, 31 Dec 2004 08:25:04 +0000 (08:25 +0000)
Fix for invalid :default-initargs not being caught by ctor
... disable ctor if any default-initarg keys are invalid

src/pcl/ctor.lisp
tests/clos.impure-cload.lisp
version.lisp-expr

index 6ef5386..9e09462 100644 (file)
         (and (symbolp constant)
              (not (null (symbol-package constant)))))))
 
+;;; somewhat akin to DEFAULT-INITARGS (SLOT-CLASS T T), but just
+;;; collecting the defaulted initargs for the call.
+(defun ctor-default-initkeys (supplied-initargs class-default-initargs)
+  (loop for (key nil) in class-default-initargs
+        when (eq (getf supplied-initargs key '.not-there.) '.not-there.)
+        collect key))
 \f
 ;;; *****************
 ;;; CTORS   *********
                      (member (slot-definition-allocation x)
                              '(:instance :class)))
                    (class-slots class))
-            (null (check-initargs-1 class (plist-keys (ctor-initargs ctor))
-                                    (append ii-methods si-methods) nil nil))
+            (null (check-initargs-1
+                    class
+                    (append
+                     (ctor-default-initkeys
+                      (ctor-initargs ctor) (class-default-initargs class))
+                     (plist-keys (ctor-initargs ctor)))
+                    (append ii-methods si-methods) nil nil))
             (not (around-or-nonstandard-primary-method-p
                   ii-methods *the-system-ii-method*))
             (not (around-or-nonstandard-primary-method-p
index 26dd594..e6a4f8b 100644 (file)
            (declare (ignore x)) (setq y 'foo)))
   (style-warning (c) (error c)))
 \f
+;;; ctor optimization bugs:
+;;;
+;;; :DEFAULT-INITARGS not checked for validity
+(defclass invalid-default-initargs ()
+  ((foo :initarg :foo))
+  (:default-initargs :invalid-initarg 2))
+(multiple-value-bind (result condition)
+    (ignore-errors (make-instance 'invalid-default-initargs :foo 1))
+  (assert (null result))
+  (assert (typep condition 'program-error)))
+\f
 ;;; from Axel Schairer on cmucl-imp 2004-08-05
 (defclass class-with-symbol-initarg ()
   ((slot :initarg slot)))
index b5b2fdd..3a0b01e 100644 (file)
@@ -17,4 +17,4 @@
 ;;; checkins which aren't released. (And occasionally for internal
 ;;; versions, especially for internal versions off the main CVS
 ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"0.8.18.2"
+"0.8.18.3"