From: Christophe Rhodes Date: Sat, 12 Oct 2002 14:28:35 +0000 (+0000) Subject: 0.7.8.30: X-Git-Url: http://repo.macrolet.net/gitweb/?a=commitdiff_plain;h=401d16e683cecc6ed63d18b8e7b5824374b48d46;p=sbcl.git 0.7.8.30: Port the fix for Entomotomy bug defmethod-keyword-argument-checking-too-lax to sbcl from the fix provided by Gerd Moellmann on cmucl-imp (thanks also to Pierre Mai) --- diff --git a/src/pcl/boot.lisp b/src/pcl/boot.lisp index c3b30b2..074344d 100644 --- a/src/pcl/boot.lisp +++ b/src/pcl/boot.lisp @@ -1088,8 +1088,9 @@ bootstrapping. ,(cadr var))))))) (rest `((,var ,args-tail))) (key (cond ((not (consp var)) - `((,var (get-key-arg ,(keywordicate var) - ,args-tail)))) + `((,var (car + (get-key-arg-tail ,(keywordicate var) + ,args-tail))))) ((null (cddr var)) (multiple-value-bind (keyword variable) (if (consp (car var)) @@ -1097,8 +1098,9 @@ bootstrapping. (cadar var)) (values (keywordicate (car var)) (car var))) - `((,key (get-key-arg1 ',keyword ,args-tail)) - (,variable (if (consp ,key) + `((,key (get-key-arg-tail ',keyword + ,args-tail)) + (,variable (if ,key (car ,key) ,(cadr var)))))) (t @@ -1108,9 +1110,10 @@ bootstrapping. (cadar var)) (values (keywordicate (car var)) (car var))) - `((,key (get-key-arg1 ',keyword ,args-tail)) + `((,key (get-key-arg-tail ',keyword + ,args-tail)) (,(caddr var) ,key) - (,variable (if (consp ,key) + (,variable (if ,key (car ,key) ,(cadr var)))))))) (aux `(,var)))))) @@ -1120,15 +1123,14 @@ bootstrapping. (declare (ignorable ,args-tail)) ,@body))))) -(defun get-key-arg (keyword list) - (loop (when (atom list) (return nil)) - (when (eq (car list) keyword) (return (cadr list))) - (setq list (cddr list)))) - -(defun get-key-arg1 (keyword list) - (loop (when (atom list) (return nil)) - (when (eq (car list) keyword) (return (cdr list))) - (setq list (cddr list)))) +(defun get-key-arg-tail (keyword list) + (loop for (key . tail) on list by #'cddr + when (null tail) do + ;; FIXME: Do we want to export this symbol? Or maybe use an + ;; (ERROR 'SIMPLE-PROGRAM-ERROR) form? + (sb-c::%odd-key-args-error) + when (eq key keyword) + return tail)) (defun walk-method-lambda (method-lambda required-parameters env slots calls) (let ((call-next-method-p nil) ; flag indicating that CALL-NEXT-METHOD diff --git a/tests/clos.impure.lisp b/tests/clos.impure.lisp index d3a76aa..4f26a68 100644 --- a/tests/clos.impure.lisp +++ b/tests/clos.impure.lisp @@ -291,7 +291,15 @@ (assert-program-error (defclass foo003 () ((a :allocation :class :allocation :class)))) (assert-program-error (defclass foo004 () - ((a :silly t))))) + ((a :silly t)))) + ;; and some more, found by Wolfhard Buss and fixed for cmucl by Gerd + ;; Moellmann in 0.7.8.x: + (assert-program-error (progn + (defmethod odd-key-args-checking (&key (key 42)) key) + (odd-key-args-checking 3))) + (assert (= (odd-key-args-checking) 42)) + (assert (eq (odd-key-args-checking :key t) t))) + ;;;; success diff --git a/version.lisp-expr b/version.lisp-expr index 4625155..e633c5b 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -18,4 +18,4 @@ ;;; internal versions off the main CVS branch, it gets hairier, e.g. ;;; "0.pre7.14.flaky4.13".) -"0.7.8.29" +"0.7.8.30"