X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fload.lisp;h=48c3ccb50c86e52d2af0056a8265a8fdcd82d7ca;hb=b7a8f5313a83dea33ce60551a4fb987b415c2cc6;hp=1b552ae0dba8b6d917aafbc8f0450bae2e24b286;hpb=e365f2f7a9c66d307b48fee70778f4eaa84bdcc0;p=sbcl.git diff --git a/src/code/load.lisp b/src/code/load.lisp index 1b552ae..48c3ccb 100644 --- a/src/code/load.lisp +++ b/src/code/load.lisp @@ -222,7 +222,7 @@ (let ((byte (read-byte stream nil))) (when byte - ;; Read the string part of the fasl header, or die. + ;; Read and validate constant string prefix in fasl header. (let* ((fhsss *fasl-header-string-start-string*) (fhsss-length (length fhsss))) (unless (= byte (char-code (schar fhsss 0))) @@ -237,33 +237,52 @@ (error "illegal subsequent (not first) byte in fasl file header")))) - ;; Read and validate implementation and version, or die. - (let* ((implementation-length (read-arg 4)) - (implementation-string (make-string implementation-length)) - (ignore (read-string-as-bytes stream implementation-string)) - (implementation (keywordicate implementation-string)) - ;; FIXME: The logic above to read a keyword from the fasl file - ;; could probably be shared with the read-a-keyword fop. - (version (read-arg 4))) - (declare (ignore ignore)) - (flet ((check-version (variant possible-implementation needed-version) - (when (string= possible-implementation implementation) - (unless (= version needed-version) - (error "~@<~S is in ~A fasl file format version ~W, ~ - but this version of SBCL uses ~ - format version ~W.~:@>" - stream - variant - version - needed-version)) - t))) - (or (check-version "native code" - +backend-fasl-file-implementation+ - +fasl-file-version+) - (error "~S was compiled for implementation ~A, but this is a ~A." - stream - implementation - +backend-fasl-file-implementation+))))))) + ;; Read and validate version-specific compatibility stuff. + (flet ((string-from-stream () + (let* ((length (read-arg 4)) + (result (make-string length))) + (read-string-as-bytes stream result) + result))) + ;; Read and validate implementation and version. + (let* ((implementation (keywordicate (string-from-stream))) + ;; FIXME: The logic above to read a keyword from the fasl file + ;; could probably be shared with the read-a-keyword fop. + (version (read-arg 4))) + (flet ((check-version (variant + possible-implementation + needed-version) + (when (string= possible-implementation implementation) + (or (= version needed-version) + (error "~@<~S is in ~A fasl file format version ~W, ~ + but this version of SBCL uses ~ + format version ~W.~:@>" + stream + variant + version + needed-version))))) + (or (check-version "native code" + +backend-fasl-file-implementation+ + +fasl-file-version+) + (error "~S was compiled for implementation ~A, ~ + but this is a ~A." + stream + implementation + +backend-fasl-file-implementation+)))) + ;; Read and validate *FEATURES* which affect binary compatibility. + (let ((faff-in-this-file (string-from-stream))) + (unless (string= faff-in-this-file *features-affecting-fasl-format*) + (error + "~@" + '*features* + stream + *features-potentially-affecting-fasl-format* + *features-affecting-fasl-format* + faff-in-this-file))) + ;; success + t)))) ;; Setting this variable gives you a trace of fops as they are loaded and ;; executed.