+;;;; Conditions signalled on invalid fasls (wrong fasl version, etc),
+;;;; so that user code (esp. ASDF) can reasonably handle attempts to
+;;;; load such fasls by recompiling them, etc. For simplicity's sake
+;;;; make only condition INVALID-FASL part of the public interface,
+;;;; and keep the guts internal.
+
+(define-condition sb!ext::invalid-fasl (error)
+ ((stream :reader invalid-fasl-stream :initarg :stream)
+ (expected :reader invalid-fasl-expected :initarg :expected))
+ (:report
+ (lambda (condition stream)
+ (format stream "~S is an invalid fasl file."
+ (invalid-fasl-stream condition)))))
+
+(define-condition invalid-fasl-header (sb!ext::invalid-fasl)
+ ((byte :reader invalid-fasl-byte :initarg :byte)
+ (byte-nr :reader invalid-fasl-byte-nr :initarg :byte-nr))
+ (:report
+ (lambda (condition stream)
+ (format stream "~@<~S contains an illegal byte in the FASL header at ~
+ position ~A: Expected ~A, got ~A.~:@>"
+ (invalid-fasl-stream condition)
+ (invalid-fasl-byte-nr condition)
+ (invalid-fasl-byte condition)
+ (invalid-fasl-expected condition)))))
+
+(define-condition invalid-fasl-version (sb!ext::invalid-fasl)
+ ((variant :reader invalid-fasl-variant :initarg :variant)
+ (version :reader invalid-fasl-version :initarg :version))
+ (:report
+ (lambda (condition stream)
+ (format stream "~@<~S is in ~A fasl file format version ~W, ~
+ but this version of SBCL uses format version ~W.~:@>"
+ (invalid-fasl-stream condition)
+ (invalid-fasl-variant condition)
+ (invalid-fasl-version condition)
+ (invalid-fasl-expected condition)))))
+
+(define-condition invalid-fasl-implementation (sb!ext::invalid-fasl)
+ ((implementation :reader invalid-fasl-implementation
+ :initarg :implementation))
+ (:report
+ (lambda (condition stream)
+ (format stream "~S was compiled for implementation ~A, but this is a ~A."
+ (invalid-fasl-stream condition)
+ (invalid-fasl-implementation condition)
+ (invalid-fasl-expected condition)))))
+
+(define-condition invalid-fasl-features (sb!ext::invalid-fasl)
+ ((potential-features :reader invalid-fasl-potential-features
+ :initarg :potential-features)
+ (features :reader invalid-fasl-features :initarg :features))
+ (:report
+ (lambda (condition stream)
+ (format stream "~@<incompatible ~S in fasl file ~S: ~2I~_~
+ Of features affecting binary compatibility, ~4I~_~S~2I~_~
+ the fasl has ~4I~_~A,~2I~_~
+ while the runtime expects ~4I~_~A.~:>"
+ '*features*
+ (invalid-fasl-stream condition)
+ (invalid-fasl-potential-features condition)
+ (invalid-fasl-features condition)
+ (invalid-fasl-expected condition)))))
+