Changeset 12067


Ignore:
Timestamp:
07/27/09 20:10:46 (14 years ago)
Author:
vvoutilainen
Message:

Better initarg checking. Fixes CHANGE-CLASS.1.11, MAKE-INSTANCE.ERROR.3 and MAKE-INSTANCE.ERROR.4.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abcl/src/org/armedbear/lisp/clos.lisp

    r12042 r12067  
    19701970;; methods, along with the predefined initialization argument :ALLOW-OTHER-KEYS."
    19711971;; 7.1.2
    1972 #+nil
    1973 (defun check-initargs (class initargs)
     1972
     1973(defun check-initargs (instance shared-initialize-param initargs)
    19741974  (when (oddp (length initargs))
    19751975    (error 'program-error
    19761976           :format-control "Odd number of keyword arguments."))
    19771977  (unless (getf initargs :allow-other-keys)
    1978     (let ((slots (%class-slots class)))
     1978    (let ((methods (compute-applicable-methods #'shared-initialize
     1979                 (if initargs
     1980               `(,instance ,shared-initialize-param ,@initargs)
     1981             (list instance shared-initialize-param))))
     1982    (slots (%class-slots (class-of instance))))
    19791983      (do* ((tail initargs (cddr tail))
    19801984            (initarg (car tail) (car tail)))
    19811985           ((null tail))
    19821986        (unless (or (valid-initarg-p initarg slots)
     1987        (valid-methodarg-p initarg methods)
    19831988                    (eq initarg :allow-other-keys))
    19841989          (error 'program-error
     
    19871992
    19881993;; FIXME
    1989 (defun check-initargs (class initargs)
    1990   (declare (ignore class initargs)))
     1994
     1995;(defun check-initargs (class initargs)
     1996;  (declare (ignore class initargs)))
     1997
     1998(defun valid-methodarg-p (initarg methods)
     1999  (dolist (method methods nil)
     2000    (let ((valid-initargs (method-lambda-list method)))
     2001      (when (find (symbol-value initarg) valid-initargs :test #'string=)
     2002        (return t)))))
    19912003
    19922004(defun valid-initarg-p (initarg slots)
     
    20132025            (setf default-initargs (append default-initargs (list key (funcall fn))))))
    20142026        (setf initargs (append initargs default-initargs)))))
    2015   (check-initargs class initargs)
     2027
    20162028  (let ((instance (std-allocate-instance class)))
     2029    (check-initargs instance t initargs)
    20172030    (apply #'initialize-instance instance initargs)
    20182031    instance))
     
    20992112                    (mapcar #'%slot-definition-name
    21002113                            (%class-slots (class-of new))))))
    2101     (check-initargs (class-of new) initargs)
     2114    (check-initargs new added-slots initargs)
    21022115    (apply #'shared-initialize new added-slots initargs)))
    21032116
     
    21282141            property-list
    21292142            &rest initargs)
    2130   (check-initargs (class-of instance) initargs)
     2143  (check-initargs instance added-slots initargs)
    21312144  (apply #'shared-initialize instance added-slots initargs))
    21322145
Note: See TracChangeset for help on using the changeset viewer.