From 4e41caab66abbb26b7cbcc8331140b477a3a21da Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Thu, 9 Feb 2017 14:34:14 +0300 Subject: [PATCH] Add SB-EXT:UNKNOWN-KEYWORD-ARGUMENT condition. Now that unknown keyword errors are continuable it's a good idea to have them identifiable as well. Also mention in the continue restart that it will ignore all the unknown keyword arguments. --- package-data-list.lisp-expr | 3 ++- src/code/condition.lisp | 7 +++++++ src/code/interr.lisp | 10 +++------- tests/condition.impure.lisp | 6 +++++- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/package-data-list.lisp-expr b/package-data-list.lisp-expr index 009881cbe..b17bf50ff 100644 --- a/package-data-list.lisp-expr +++ b/package-data-list.lisp-expr @@ -922,7 +922,8 @@ like *STACK-TOP-HINT* and unsupported stuff like *TRACED-FUN-LIST*." ;; versioning utility "ASSERT-VERSION->=" - + "UNKNOWN-KEYWORD-ARGUMENT" + "UNKNOWN-KEYWORD-ARGUMENT-NAME" "CALLABLE-CAST")) #s(sb-cold:package-data diff --git a/src/code/condition.lisp b/src/code/condition.lisp index ad5cab0c4..ba72a13e8 100644 --- a/src/code/condition.lisp +++ b/src/code/condition.lisp @@ -961,6 +961,13 @@ SB-EXT:PACKAGE-LOCKED-ERROR-SYMBOL.")) (cell-error-name condition)) (format stream "Attempt to call an undefined alien function."))))) +(define-condition unknown-keyword-argument (program-error) + ((name :reader unknown-keyword-argument-name :initarg :name)) + (:report + (lambda (condition stream) + (format stream "Unknown &KEY argument: ~S" + (unknown-keyword-argument-name condition))))) + ;;;; various other (not specified by ANSI) CONDITIONs ;;;; diff --git a/src/code/interr.lisp b/src/code/interr.lisp index 5ad225c1f..c856c4467 100644 --- a/src/code/interr.lisp +++ b/src/code/interr.lisp @@ -242,17 +242,13 @@ (let ((context (sb!di:error-context))) (if (integerp context) (restart-case - (error 'simple-program-error - :format-control "unknown &KEY argument: ~S" - :format-arguments (list key-name)) + (error 'unknown-keyword-argument :name key-name) (continue () :report (lambda (stream) - (format stream "Ignore it.")) + (format stream "Ignore all unknown keywords")) (sb!vm::incf-context-pc *current-internal-error-context* context))) - (error 'simple-program-error - :format-control "unknown &KEY argument: ~S" - :format-arguments (list key-name))))) + (error 'unknown-keyword-argument :name key-name)))) ;; TODO: make the arguments (ARRAY INDEX &optional BOUND) ;; and don't need the bound for vectors. Just read it. diff --git a/tests/condition.impure.lisp b/tests/condition.impure.lisp index 795757539..8136cc101 100644 --- a/tests/condition.impure.lisp +++ b/tests/condition.impure.lisp @@ -538,7 +538,11 @@ (assert (eq (test-use-value return) value-lambda))))) (with-test (:name :unknown-key-restart) - (handler-bind ((error #'continue)) + (handler-bind ((sb-ext:unknown-keyword-argument + (lambda (c) + (assert (eq (sb-ext:unknown-keyword-argument-name c) + :bogus)) + (continue c)))) (assert (= (funcall (checked-compile '(lambda (&key abc) (1+ abc))) :bogus 30 :abc 20) 21)))) -- 2.11.4.GIT