+ ,@body))))
+
+;;; Helper for making the DX closure allocation in WITHOUT-INTERRUPTS
+;;; less ugly.
+;;;
+;;; TODO: generalize for cases where FUNCTION takes more arguments
+;;; than just the thunk; use in other WITH-FOO macros that expand to a
+;;; CALL-WITH-FOO. I just did WITHOUT-INTERRUPTS since it's
+;;; performance critical (for example each call to GETHASH was consing
+;;; 48 bytes of WITHOUT-INTERRUPTS closures). --JES, 2007-06-08
+(sb!xc:defmacro call-with-dx-function ((function &rest args) &body body)
+ (with-unique-names (fun1 fun2)
+ `(flet ((,fun1 (,@args)
+ ,@body))
+ (declare (optimize sb!c::stack-allocate-dynamic-extent))
+ (flet ((,fun2 (,@args)
+ ;; Avoid consing up a closure: FUN1 will be inlined
+ ;; and FUN2 will be stack-allocated, so we avoid
+ ;; consing up a closure. This is split into two
+ ;; separate functions to ensure that the body doesn't
+ ;; get compiled with (OPTIMIZE
+ ;; SB!C::STACK-ALLOCATE-DYNAMIC-EXTENT), which could
+ ;; cause problems e.g. when the body contains
+ ;; DYNAMIC-EXTENT declarations and the code is being
+ ;; compiled with (SAFETY 3).
+ (,fun1 ,@args)))
+ (declare (dynamic-extent (function ,fun2)))
+ (,function (function ,fun2))))))