Ignore:
Timestamp:
08/14/21 06:21:39 (2 years ago)
Author:
Mark Evenson
Message:

Proposal fix to https://abcl.org/trac/ticket/485

File:
1 edited

Legend:

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

    r15459 r15513  
    21792179(declaim (ftype (function * method) ensure-method))
    21802180(defun ensure-method (name &rest all-keys)
    2181   (let ((method-lambda-list (getf all-keys :lambda-list))
    2182         (gf (find-generic-function name nil)))
     2181  (let* ((method-lambda-list (getf all-keys :lambda-list))
     2182         (gf (find-generic-function name nil))
     2183         (gf-lambda-list (copy-tree method-lambda-list)))
    21832184    (when (or (eq gf *gf-initialize-instance*)
    21842185              (eq gf *gf-allocate-instance*)
     
    21902191      (clrhash *make-instance-initargs-cache*)
    21912192      (clrhash *reinitialize-instance-initargs-cache*))
     2193
     2194    (let ((plist (analyze-lambda-list method-lambda-list)))
     2195      (when (getf plist :keywords)
     2196        ;; remove all keywords arguments for the generic function definition
     2197        (setf gf-lambda-list
     2198              (append (subseq gf-lambda-list 0 (position '&key gf-lambda-list))
     2199                      '(&key) (if (getf plist :auxiliary-args)
     2200                                  (subseq gf-lambda-list (position '&aux gf-lambda-list)))))))
    21922201    (if gf
    21932202  (restart-case
     
    21962205    (unbind-and-try-again () :report (lambda(s) (format s "Undefine generic function #'~a and continue" name))
    21972206      (fmakunbound name)
    2198       (setf gf (ensure-generic-function name :lambda-list method-lambda-list))))
    2199         (setf gf (ensure-generic-function name :lambda-list method-lambda-list)))
     2207      (setf gf (ensure-generic-function name :lambda-list gf-lambda-list))))
     2208        (setf gf (ensure-generic-function name :lambda-list gf-lambda-list)))
    22002209    (let ((method
    22012210           (if (eq (generic-function-method-class gf) +the-standard-method-class+)
     
    23482357                                         '(&rest &optional &key
    23492358                                           &allow-other-keys))))
    2350               (no-aux (null (some 
    2351                              (lambda (method) 
     2359              (no-aux (null (some
     2360                             (lambda (method)
    23522361                               (find '&aux (std-slot-value method 'sys::lambda-list)))
    23532362                             methods))))
     
    24842493    (let ((specializer (car specializers)))
    24852494      (if (typep specializer 'eql-specializer)
    2486           (if (eql (class-of (eql-specializer-object specializer)) 
     2495          (if (eql (class-of (eql-specializer-object specializer))
    24872496                   (car classes))
    24882497              (setf knownp nil)
     
    27512760         (walk-form (%cdr form)))))
    27522761
    2753 (defmacro flet-call-next-method (args next-emfun &body body) 
     2762(defmacro flet-call-next-method (args next-emfun &body body)
    27542763  `(flet ((call-next-method (&rest cnm-args)
    27552764            (if (null ,next-emfun)
     
    27892798                                         ,(%cadr lambda-list)))
    27902799                     ,@declarations
    2791                      (flet-call-next-method args next-emfun 
     2800                     (flet-call-next-method args next-emfun
    27922801                       ,@body))))
    27932802               (3
     
    28002809                                         ,(%caddr lambda-list)))
    28012810                     ,@declarations
    2802                      (flet-call-next-method args next-emfun 
     2811                     (flet-call-next-method args next-emfun
    28032812                       ,@body))))
    28042813               (t
     
    28062815                   (apply #'(lambda ,lambda-list
    28072816                              ,@declarations
    2808                               (flet-call-next-method args next-emfun 
     2817                              (flet-call-next-method args next-emfun
    28092818                                ,@body))
    28102819                          args))))
     
    28482857                 ,@body))
    28492858            nil))))))
    2850        
     2859
    28512860
    28522861(declaim (notinline make-method-lambda))
     
    30393048         when (eq (car method-form) :method)
    30403049        collect
    3041         (multiple-value-bind (function-name qualifiers lambda-list specializers documentation declarations body) 
     3050        (multiple-value-bind (function-name qualifiers lambda-list specializers documentation declarations body)
    30423051      (mop::parse-defmethod `(,function-name ,@(rest method-form)))
    30433052          `(sys::record-source-information-for-type ',function-name '(:method ,function-name ,qualifiers ,specializers))))
     
    31833192
    31843193(defmethod ensure-class-using-class :before (class name  &key direct-slots
    3185                                              direct-default-initargs 
     3194                                             direct-default-initargs
    31863195                                             &allow-other-keys)
    31873196  (check-duplicate-slots direct-slots)
     
    33233332
    33243333;;; Slot access
    3325 ;;; 
     3334;;;
    33263335;;; See AMOP pg. 156ff. for an overview.
    3327 ;;; 
     3336;;;
    33283337;;; AMOP specifies these generic functions to dispatch on slot objects
    33293338;;; (with the exception of slot-exists-p-using-class), although its
     
    45864595
    45874596(provide "CLOS")
    4588 
Note: See TracChangeset for help on using the changeset viewer.