(declare (type (unsigned-byte #.n-widetag-bits) widetag)
(type (unsigned-byte #.n-word-bits) words)
(type index length))
- (handler-case
- ;; WITHOUT-GCING implies WITHOUT-INTERRUPTS
- (without-gcing
- (let* ((pointer *static-space-free-pointer*) ; in words
- (free (* pointer n-word-bytes))
- (vector (logior free other-pointer-lowtag)) ; in bytes, yay
- ;; rounded to dual word boundary
- (nwords (logandc2 (+ lowtag-mask (+ words vector-data-offset 1))
- lowtag-mask))
- (new-pointer (+ *static-space-free-pointer* nwords))
- (new-free (* new-pointer n-word-bytes)))
- ;; FIXME: don't signal while in WITHOUT-GCING, the handler
- ;; risks deadlock with SIG_STOP_FOR_GC.
- (unless (> static-space-end new-free)
- (error 'simple-storage-condition
- :format-control "Not enough memory left in static space to ~
- allocate vector."))
- (store-word widetag
- vector 0 other-pointer-lowtag)
- (store-word (ash length word-shift)
- vector vector-length-slot other-pointer-lowtag)
- (store-word 0 new-free)
- (setf *static-space-free-pointer* new-pointer)
- (%make-lisp-obj vector)))
- (serious-condition (c)
- ;; unwind from WITHOUT-GCING
- (error c))))
+ ;; WITHOUT-GCING implies WITHOUT-INTERRUPTS
+ (or
+ (without-gcing
+ (let* ((pointer *static-space-free-pointer*) ; in words
+ (free (* pointer n-word-bytes))
+ (vector (logior free other-pointer-lowtag)) ; in bytes, yay
+ ;; rounded to dual word boundary
+ (nwords (logandc2 (+ lowtag-mask (+ words vector-data-offset 1))
+ lowtag-mask))
+ (new-pointer (+ *static-space-free-pointer* nwords))
+ (new-free (* new-pointer n-word-bytes)))
+ (when (> static-space-end new-free)
+ (store-word widetag
+ vector 0 other-pointer-lowtag)
+ (store-word (ash length word-shift)
+ vector vector-length-slot other-pointer-lowtag)
+ (store-word 0 new-free)
+ (setf *static-space-free-pointer* new-pointer)
+ (%make-lisp-obj vector))))
+ (error 'simple-storage-condition
+ :format-control "Not enough memory left in static space to ~
+ allocate vector.")))