X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fir1-translators.lisp;h=94094825ea093629252a3a04ffedad5096a61f1d;hb=f2942b56a5ed1b60b730b387ee2b9e40c8cc28fb;hp=fc3398072edacb89930835fe639ce3ff2d844455;hpb=9a59de1cbad910e2206686e3f64f1e429faffda4;p=sbcl.git diff --git a/src/compiler/ir1-translators.lisp b/src/compiler/ir1-translators.lisp index fc33980..9409482 100644 --- a/src/compiler/ir1-translators.lisp +++ b/src/compiler/ir1-translators.lisp @@ -597,7 +597,7 @@ be a lambda expression." (def-ir1-translator %funcall ((function &rest args) start next result) ;; MACROEXPAND so that (LAMBDA ...) forms arriving here don't get an ;; extra cast inserted for them. - (let* ((function (sb!xc:macroexpand function *lexenv*)) + (let* ((function (%macroexpand function *lexenv*)) (op (when (consp function) (car function)))) (cond ((eq op 'function) (compiler-destructuring-bind (thing) (cdr function) @@ -916,6 +916,12 @@ is unable to derive from other declared types." ;;; whatever you tell it. It will never generate a type check, but ;;; will cause a warning if the compiler can prove the assertion is ;;; wrong. +;;; +;;; For the benefit of code-walkers we also add a macro-expansion. (Using INFO +;;; directly to get around safeguards for adding a macro-expansion for special +;;; operator.) Because :FUNCTION :KIND remains :SPECIAL-FORM, the compiler +;;; never uses the macro -- but manually calling its MACRO-FUNCTION or +;;; MACROEXPANDing TRULY-THE forms does. (def-ir1-translator truly-the ((value-type form) start next result) #!+sb-doc "Specifies that the values returned by FORM conform to the @@ -926,6 +932,12 @@ Consequences are undefined if any result is not of the declared type -- typical symptoms including memory corruptions. Use with great care." (the-in-policy value-type form '((type-check . 0)) start next result)) + +#-sb-xc-host +(setf (info :function :macro-function 'truly-the) + (lambda (whole env) + (declare (ignore env)) + `(the ,@(cdr whole)))) ;;;; SETQ