0.7.8.12:
[sbcl.git] / src / compiler / generic / utils.lisp
index f690caa..38fa31c 100644 (file)
@@ -1,4 +1,5 @@
-;;;; utility functions needed by the back end to generate code
+;;;; utility functions and macros needed by the back end to generate
+;;;; code
 
 ;;;; This software is part of the SBCL system. See the README file for
 ;;;; more information.
@@ -15,7 +16,7 @@
 (defun fixnumize (num)
   (if (<= #x-20000000 num #x1fffffff)
       (ash num 2)
-      (error "~D is too big for a fixnum." num)))
+      (error "~W is too big for a fixnum." num)))
 \f
 ;;;; routines for dealing with static symbols
 
@@ -43,7 +44,7 @@
                       (- (pad-data-block (1- symbol-size))))
                    (pad-data-block symbol-size))
        (unless (and (zerop rem) (<= 0 n (1- (length *static-symbols*))))
-         (error "The byte offset ~D is not valid." offset))
+         (error "The byte offset ~W is not valid." offset))
        (elt *static-symbols* n))))
 
 ;;; Return the (byte) offset from NIL to the start of the fdefn object
        (- list-pointer-lowtag)
        (* static-fun-index (pad-data-block fdefn-size))
        (* fdefn-raw-addr-slot n-word-bytes))))
+\f
+;;; Various error-code generating helpers
+(defvar *adjustable-vectors* nil)
+
+(defmacro with-adjustable-vector ((var) &rest body)
+  `(let ((,var (or (pop *adjustable-vectors*)
+                   (make-array 16
+                               :element-type '(unsigned-byte 8)
+                               :fill-pointer 0
+                               :adjustable t))))
+     (declare (type (vector (unsigned-byte 8) 16) ,var))
+     (setf (fill-pointer ,var) 0)
+     (unwind-protect
+         (progn
+           ,@body)
+       (push ,var *adjustable-vectors*))))