- (unless (= prev-priority (second const))
- (terpri)
- (setf prev-priority (second const)))
- (format t
- "#define ~A ~D /* 0x~X */~@[ /* ~A */~]~%"
- (first const)
- (third const)
- (third const)
- (fourth const))))
- (terpri)
- (format t "#define ERRORS { \\~%")
- ;; FIXME: Is this just DO-VECTOR?
- (let ((internal-errors sb!c:*backend-internal-errors*))
- (dotimes (i (length internal-errors))
- (format t " ~S, /*~D*/ \\~%" (cdr (aref internal-errors i)) i)))
- (format t " NULL \\~%}~%")
+ (destructuring-bind (name priority value doc) const
+ (unless (= prev-priority priority)
+ (terpri)
+ (setf prev-priority priority))
+ (format t "#define ~A " name)
+ (format t
+ ;; KLUDGE: As of sbcl-0.6.7.14, we're dumping two
+ ;; different kinds of values here, (1) small codes
+ ;; and (2) machine addresses. The small codes can be
+ ;; dumped as bare integer values. The large machine
+ ;; addresses might cause problems if they're large
+ ;; and represented as (signed) C integers, so we
+ ;; want to force them to be unsigned. We do that by
+ ;; wrapping them in the LISPOBJ macro. (We could do
+ ;; it with a bare "(unsigned)" cast, except that
+ ;; this header file is used not only in C files, but
+ ;; also in assembly files, which don't understand
+ ;; the cast syntax. The LISPOBJ macro goes away in
+ ;; assembly files, but that shouldn't matter because
+ ;; we don't do arithmetic on address constants in
+ ;; assembly files. See? It really is a kludge..) --
+ ;; WHN 2000-10-18
+ (let (;; cutoff for treatment as a small code
+ (cutoff (expt 2 16)))
+ (cond ((minusp value)
+ (error "stub: negative values unsupported"))
+ ((< value cutoff)
+ "~D")
+ (t
+ "LISPOBJ(~D)")))
+ value)
+ (format t " /* 0x~X */~@[ /* ~A */~]~%" value doc))))