X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fdump.lisp;h=cbf4323799c654fc9004558da5ad00cdf9ebb59f;hb=d59fb3b0953c8d14427b60f949a0e567a8b79fe0;hp=24cee41822067b39252ff97df9ac9e093cc03d8d;hpb=0aa292df08039389cebc1c7d1f2134121b9b3fdf;p=sbcl.git diff --git a/src/compiler/dump.lisp b/src/compiler/dump.lisp index 24cee41..cbf4323 100644 --- a/src/compiler/dump.lisp +++ b/src/compiler/dump.lisp @@ -113,6 +113,14 @@ (dotimes (i sb!vm:n-word-bytes) (write-byte (ldb (byte 8 (* 8 i)) num) stream)))) +;; Dump a 32-bit integer. +(defun dump-unsigned-byte-32 (num fasl-output) + (declare (type sb!vm:word num)) + (declare (type fasl-output fasl-output)) + (let ((stream (fasl-output-stream fasl-output))) + (dotimes (i 4) + (write-byte (ldb (byte 8 (* 8 i)) num) stream)))) + ;;; Dump NUM to the fasl stream, represented by N bytes. This works ;;; for either signed or unsigned integers. There's no range checking ;;; -- if you don't specify enough bytes for the number to fit, this @@ -314,7 +322,12 @@ ;; Finish the header by outputting fasl file implementation, ;; version, and key *FEATURES*. (flet ((dump-counted-string (string) - (dump-word (length string) res) + ;; The count is dumped as a 32-bit unsigned-byte even on 64-bit + ;; platforms. This ensures that a x86-64 SBCL can gracefully + ;; detect an error when trying to read a x86 fasl, instead + ;; of choking on a ridiculously long counted string. + ;; -- JES, 2005-12-30 + (dump-unsigned-byte-32 (length string) res) (dotimes (i (length string)) (dump-byte (char-code (aref string i)) res)))) (dump-counted-string (symbol-name +backend-fasl-file-implementation+))