X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fir1tran-lambda.lisp;h=4ae5cae617cebf9411dc85f9eb5b93c9372219dd;hb=d6f9676ae94419cb5544c45821a8d31adbc1fbe8;hp=04045883ed2b76bdef3b772bd9aa6e387d154119;hpb=6a6735b1da0967fcbe59ec8634ef422121a87d75;p=sbcl.git diff --git a/src/compiler/ir1tran-lambda.lisp b/src/compiler/ir1tran-lambda.lisp index 0404588..4ae5cae 100644 --- a/src/compiler/ir1tran-lambda.lisp +++ b/src/compiler/ir1tran-lambda.lisp @@ -544,8 +544,7 @@ (arg-vars context-temp count-temp) (when rest - (arg-vals `(%listify-rest-args - ,n-context ,n-count))) + (arg-vals `(%listify-rest-args ,n-context ,n-count))) (when morep (arg-vals n-context) (arg-vals n-count)) @@ -561,6 +560,7 @@ (n-key (gensym "N-KEY-")) (n-value-temp (gensym "N-VALUE-TEMP-")) (n-allowp (gensym "N-ALLOWP-")) + (n-lose (gensym "N-LOSE-")) (n-losep (gensym "N-LOSEP-")) (allowp (or (optional-dispatch-allowp res) (policy *lexenv* (zerop safety)))) @@ -603,12 +603,13 @@ (tests clause))) (unless allowp - (temps n-allowp n-losep) + (temps n-allowp n-lose n-losep) (unless found-allow-p (tests `((eq ,n-key :allow-other-keys) (setq ,n-allowp ,n-value-temp)))) (tests `(t - (setq ,n-losep (list ,n-key))))) + (setq ,n-lose ,n-key + ,n-losep t)))) (body `(when (oddp ,n-count) @@ -637,7 +638,7 @@ (unless allowp (body `(when (and ,n-losep (not ,n-allowp)) - (%unknown-key-arg-error (car ,n-losep)))))))) + (%unknown-key-arg-error ,n-lose))))))) (let ((ep (ir1-convert-lambda-body `((let ,(temps) @@ -683,7 +684,23 @@ (bind-vals)) (when rest (main-vars rest) - (main-vals '())) + (main-vals '()) + (unless (lambda-var-ignorep rest) + ;; Make up two extra variables, and squirrel them away in + ;; ARG-INFO-DEFAULT for transforming (VALUES-LIST REST) into + ;; (%MORE-ARG-VALUES CONTEXT 0 COUNT) when possible. + (let* ((context-name (gensym "REST-CONTEXT")) + (context (make-lambda-var :%source-name context-name + :arg-info (make-arg-info :kind :more-context))) + (count-name (gensym "REST-COUNT")) + (count (make-lambda-var :%source-name count-name + :arg-info (make-arg-info :kind :more-count) + :type (specifier-type 'index)))) + (setf (arg-info-default (lambda-var-arg-info rest)) (list context count) + (lambda-var-ever-used context) t + (lambda-var-ever-used count) t) + (setf more-context context + more-count count)))) (when more-context (main-vars more-context) (main-vals nil)