X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fdefboot.lisp;h=c505819bd5c80ba000cf4bef391862e64b2055ec;hb=e67cc0f952040723f7d0f37ddb88fe895f4b1464;hp=625e979ff6a76bea5211f6afb9222681ba94a0f6;hpb=25422d88edd9bf712206aee5143a4f952981b4d5;p=sbcl.git diff --git a/src/code/defboot.lisp b/src/code/defboot.lisp index 625e979..c505819 100644 --- a/src/code/defboot.lisp +++ b/src/code/defboot.lisp @@ -40,7 +40,8 @@ `(let ((,(car vars) ,value-form)) ,@body) (let ((ignore (gensym))) - `(multiple-value-call #'(lambda (&optional ,@vars &rest ,ignore) + `(multiple-value-call #'(lambda (&optional ,@(mapcar #'list vars) + &rest ,ignore) (declare (ignore ,ignore)) ,@body) ,value-form))) @@ -159,7 +160,7 @@ (block ,(fun-name-block-name name) ,@forms))) (lambda `(lambda ,@lambda-guts)) - #-sb-xc-host + #-sb-xc-host (named-lambda `(named-lambda ,name ,@lambda-guts)) (inline-lambda (when (inline-fun-name-p name) @@ -174,16 +175,16 @@ `(progn ;; In cross-compilation of toplevel DEFUNs, we arrange for ;; the LAMBDA to be statically linked by GENESIS. - ;; - ;; It may seem strangely inconsistent not to use NAMED-LAMBDA - ;; here instead of LAMBDA. The reason is historical: - ;; COLD-FSET was written before NAMED-LAMBDA, and has special - ;; logic of its own to notify the compiler about NAME. - #+sb-xc-host + ;; + ;; It may seem strangely inconsistent not to use NAMED-LAMBDA + ;; here instead of LAMBDA. The reason is historical: + ;; COLD-FSET was written before NAMED-LAMBDA, and has special + ;; logic of its own to notify the compiler about NAME. + #+sb-xc-host (cold-fset ,name ,lambda) - + (eval-when (:compile-toplevel) - (sb!c:%compiler-defun ',name ',inline-lambda)) + (sb!c:%compiler-defun ',name ',inline-lambda t)) (eval-when (:load-toplevel :execute) (%defun ',name ;; In normal compilation (not for cold load) this is @@ -200,7 +201,7 @@ (declare (type function def)) (declare (type (or null simple-string) doc)) (aver (legal-fun-name-p name)) ; should've been checked by DEFMACRO DEFUN - (sb!c:%compiler-defun name inline-lambda) + (sb!c:%compiler-defun name inline-lambda nil) (when (fboundp name) (/show0 "redefining NAME in %DEFUN") (style-warn "redefining ~S in DEFUN" name)) @@ -211,7 +212,7 @@ ;; something sane, (1) doing so doesn't really fix the bug, and ;; (2) doing probably isn't even really safe. #+nil (setf (%fun-name def) name) - + (when doc (setf (fdocumentation name 'function) doc)) name) @@ -313,6 +314,16 @@ (declare (type unsigned-byte ,var)) ,@body))))) +(defun filter-dolist-declarations (decls) + (mapcar (lambda (decl) + `(declare ,@(remove-if + (lambda (clause) + (and (consp clause) + (or (eq (car clause) 'type) + (eq (car clause) 'ignore)))) + (cdr decl)))) + decls)) + (defmacro-mundanely dolist ((var list &optional (result nil)) &body body) ;; We repeatedly bind the var instead of setting it so that we never ;; have to give the var an arbitrary value such as NIL (which might @@ -337,6 +348,11 @@ (go ,start)))) ,(if result `(let ((,var nil)) + ;; Filter out TYPE declarations (VAR gets bound to NIL, + ;; and might have a conflicting type declaration) and + ;; IGNORE (VAR might be ignored in the loop body, but + ;; it's used in the result form). + ,@(filter-dolist-declarations decls) ,var ,result) nil))))) @@ -351,9 +367,8 @@ (defmacro-mundanely with-condition-restarts (condition-form restarts-form &body body) #!+sb-doc - "WITH-CONDITION-RESTARTS Condition-Form Restarts-Form Form* - Evaluates the Forms in a dynamic environment where the restarts in the list - Restarts-Form are associated with the condition returned by Condition-Form. + "Evaluates the BODY in a dynamic environment where the restarts in the list + RESTARTS-FORM are associated with the condition returned by CONDITION-FORM. This allows FIND-RESTART, etc., to recognize restarts that are not related to the error currently being debugged. See also RESTART-CASE." (let ((n-cond (gensym))) @@ -378,7 +393,7 @@ binding :test #'eq)) (warn "Unnamed restart does not have a ~ - report function: ~S" + report function: ~S" binding)) `(make-restart :name ',(car binding) :function ,(cadr binding)