X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fmacros.lisp;h=015768c573fa848fef55ac6a515b1fe0ab12fd30;hb=1ac136852028fcd4d5568e996ebc612136c26b4f;hp=d5110de69a7d707e5a122efb4e3585cdd79205b6;hpb=d604a358d8e5eb5587989e0a4f1d31dbe6ac5ffe;p=sbcl.git diff --git a/src/compiler/macros.lisp b/src/compiler/macros.lisp index d5110de..015768c 100644 --- a/src/compiler/macros.lisp +++ b/src/compiler/macros.lisp @@ -22,6 +22,10 @@ ;;; if policy favors. ;;; :MAYBE-INLINE ;;; Retain expansion, but only use it opportunistically. +;;; :MAYBE-INLINE is quite different from :INLINE. As explained +;;; by APD on #lisp 2005-11-26: "MAYBE-INLINE lambda is +;;; instantiated once per component, INLINE - for all +;;; references (even under #'without FUNCALL)." (deftype inlinep () '(member :inline :maybe-inline :notinline nil)) ;;;; source-hacking defining forms @@ -36,42 +40,41 @@ ;;; kind to associate with NAME. (defmacro def-ir1-translator (name (lambda-list start-var next-var result-var) &body body) - (let ((fn-name (symbolicate "IR1-CONVERT-" name)) - (n-form (gensym)) - (n-env (gensym))) - (multiple-value-bind (body decls doc) - (parse-defmacro lambda-list n-form body name "special form" - :environment n-env - :error-fun 'compiler-error - :wrap-block nil) - `(progn - (declaim (ftype (function (ctran ctran (or lvar null) t) (values)) - ,fn-name)) - (defun ,fn-name (,start-var ,next-var ,result-var ,n-form - &aux (,n-env *lexenv*)) - (declare (ignorable ,start-var ,next-var ,result-var)) - ,@decls - ,body - (values)) - ,@(when doc - `((setf (fdocumentation ',name 'function) ,doc))) - ;; FIXME: Evidently "there can only be one!" -- we overwrite any - ;; other :IR1-CONVERT value. This deserves a warning, I think. - (setf (info :function :ir1-convert ',name) #',fn-name) - ;; FIXME: rename this to SPECIAL-OPERATOR, to update it to - ;; the 1990s? - (setf (info :function :kind ',name) :special-form) - ;; It's nice to do this for error checking in the target - ;; SBCL, but it's not nice to do this when we're running in - ;; the cross-compilation host Lisp, which owns the - ;; SYMBOL-FUNCTION of its COMMON-LISP symbols. - #-sb-xc-host - (let ((fun (lambda (&rest rest) - (declare (ignore rest)) - (error 'special-form-function :name ',name)))) - (setf (%simple-fun-arglist fun) ',lambda-list) - (setf (symbol-function ',name) fun)) - ',name)))) + (let ((fn-name (symbolicate "IR1-CONVERT-" name))) + (with-unique-names (whole-var n-env) + (multiple-value-bind (body decls doc) + (parse-defmacro lambda-list whole-var body name "special form" + :environment n-env + :error-fun 'compiler-error + :wrap-block nil) + `(progn + (declaim (ftype (function (ctran ctran (or lvar null) t) (values)) + ,fn-name)) + (defun ,fn-name (,start-var ,next-var ,result-var ,whole-var + &aux (,n-env *lexenv*)) + (declare (ignorable ,start-var ,next-var ,result-var)) + ,@decls + ,body + (values)) + ,@(when doc + `((setf (fdocumentation ',name 'function) ,doc))) + ;; FIXME: Evidently "there can only be one!" -- we overwrite any + ;; other :IR1-CONVERT value. This deserves a warning, I think. + (setf (info :function :ir1-convert ',name) #',fn-name) + ;; FIXME: rename this to SPECIAL-OPERATOR, to update it to + ;; the 1990s? + (setf (info :function :kind ',name) :special-form) + ;; It's nice to do this for error checking in the target + ;; SBCL, but it's not nice to do this when we're running in + ;; the cross-compilation host Lisp, which owns the + ;; SYMBOL-FUNCTION of its COMMON-LISP symbols. + #-sb-xc-host + (let ((fun (lambda (&rest rest) + (declare (ignore rest)) + (error 'special-form-function :name ',name)))) + (setf (%simple-fun-arglist fun) ',lambda-list) + (setf (symbol-function ',name) fun)) + ',name))))) ;;; (This is similar to DEF-IR1-TRANSLATOR, except that we pass if the ;;; syntax is invalid.) @@ -93,18 +96,16 @@ ;;; OPTIMIZE parameters, then the POLICY macro should be used to ;;; determine when to pass. (defmacro source-transform-lambda (lambda-list &body body) - (let ((n-form (gensym)) - (n-env (gensym)) - (name (gensym))) + (with-unique-names (whole-var n-env name) (multiple-value-bind (body decls) - (parse-defmacro lambda-list n-form body "source transform" "form" + (parse-defmacro lambda-list whole-var body "source transform" "form" :environment n-env :error-fun `(lambda (&rest stuff) (declare (ignore stuff)) (return-from ,name (values nil t))) :wrap-block nil) - `(lambda (,n-form &aux (,n-env *lexenv*)) + `(lambda (,whole-var &aux (,n-env *lexenv*)) ,@decls (block ,name ,body)))))