(lambda () (with-local-interrupts ...)))
"
(with-unique-names (outer-allow-with-interrupts)
- `(call-without-interrupts
- (lambda (,outer-allow-with-interrupts)
- (declare (disable-package-locks allow-with-interrupts with-interrupts)
- (ignorable ,outer-allow-with-interrupts))
- (macrolet ((allow-with-interrupts (&body allow-forms)
- `(call-allowing-with-interrupts
- (lambda () ,@allow-forms)
- ,',outer-allow-with-interrupts))
- (with-local-interrupts (&body with-forms)
- `(call-with-local-interrupts
- (lambda () ,@with-forms)
- ,',outer-allow-with-interrupts)))
+ `(call-with-dx-function (call-without-interrupts
+ ,outer-allow-with-interrupts)
+ (declare (disable-package-locks allow-with-interrupts with-interrupts)
+ (ignorable ,outer-allow-with-interrupts))
+ (macrolet ((allow-with-interrupts (&body allow-forms)
+ `(call-allowing-with-interrupts
+ (lambda () ,@allow-forms)
+ ,',outer-allow-with-interrupts))
+ (with-local-interrupts (&body with-forms)
+ `(call-with-local-interrupts
+ (lambda () ,@with-forms)
+ ,',outer-allow-with-interrupts)))
(declare (enable-package-locks allow-with-interrupts with-interrupts))
- ,@body)))))
+ ,@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))))))
(sb!xc:defmacro with-interrupts (&body body)
#!+sb-doc