X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fdump.lisp;h=bf3527ed4c0aa8c234c79727d0ed801cd2ee4aca;hb=da8cb4801a3ab35070f380e22aea3d260f9df8aa;hp=24cee41822067b39252ff97df9ac9e093cc03d8d;hpb=0aa292df08039389cebc1c7d1f2134121b9b3fdf;p=sbcl.git diff --git a/src/compiler/dump.lisp b/src/compiler/dump.lisp index 24cee41..bf3527e 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+)) @@ -371,7 +384,7 @@ ;; take a little more care while dumping these. ;; So if better list coalescing is needed, start here. ;; -- WHN 2000-11-07 - (if (cyclic-list-p x) + (if (maybe-cyclic-p x) (progn (dump-list x file) (eq-save-object x file)) @@ -485,13 +498,15 @@ (dump-byte 0 file)) (dump-pop file)) -;;; Return T iff CONSTANT has not already been dumped. It's been -;;; dumped if it's in the EQ table. +;;; Return T iff CONSTANT has already been dumped. It's been dumped if +;;; it's in the EQ table. +;;; +;;; Note: historically (1) the above comment was "T iff ... has not been dumped", +;;; (2) the test was was also true if the constant had been validated / was in +;;; the valid objects table. This led to substructures occasionally skipping the +;;; validation, and hence failing the "must have been validated" test. (defun fasl-constant-already-dumped-p (constant file) - (if (or (gethash constant (fasl-output-eq-table file)) - (gethash constant (fasl-output-valid-structures file))) - t - nil)) + (and (gethash constant (fasl-output-eq-table file)) t)) ;;; Use HANDLE whenever we try to dump CONSTANT. HANDLE should have been ;;; returned earlier by FASL-DUMP-LOAD-TIME-VALUE-LAMBDA. @@ -1203,6 +1218,7 @@ (dump-object name file) (dump-object (sb!c::entry-info-arguments entry) file) (dump-object (sb!c::entry-info-type entry) file) + (dump-object (sb!c::entry-info-xref entry) file) (dump-fop 'fop-fun-entry file) (dump-word (label-position (sb!c::entry-info-offset entry)) file) (dump-pop file))) @@ -1228,7 +1244,6 @@ (declare (type component component) (list trace-table)) (declare (type fasl-output file)) - (dump-fop 'fop-verify-empty-stack file) (dump-fop 'fop-verify-table-size file) (dump-word (fasl-output-table-free file) file) @@ -1244,7 +1259,6 @@ fixups file)) (2comp (component-info component))) - (dump-fop 'fop-verify-empty-stack file) (dolist (entry (sb!c::ir2-component-entries 2comp)) (let ((entry-handle (dump-one-entry entry code-handle file)))