X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Ftarget-load.lisp;h=6f2912e75057908e22faae59b52dd80ef15495c4;hb=a80a02aec71e15e1ae7bebd502399ab2b824d08b;hp=d022e5574853dc27e055f7e412f733a32e1e9818;hpb=01488e5ddb6c8c10bc01bc9c502be1fe9de8e370;p=sbcl.git diff --git a/src/code/target-load.lisp b/src/code/target-load.lisp index d022e55..6f2912e 100644 --- a/src/code/target-load.lisp +++ b/src/code/target-load.lisp @@ -30,28 +30,36 @@ ;;; Load a text stream. (Note that load-as-fasl is in another file.) (defun load-as-source (stream verbose print) (maybe-announce-load stream verbose) - (macrolet ((do-sexprs ((sexpr stream) &body body) - (aver (symbolp sexpr)) - (with-unique-names (source-info) - (once-only ((stream stream)) - `(if (handler-case (pathname stream) - (error () nil)) - (let ((,source-info (sb!c::make-file-source-info - (pathname ,stream) - (stream-external-format ,stream)))) - (setf (sb!c::source-info-stream ,source-info) ,stream) - (sb!c::do-forms-from-info ((,sexpr) ,source-info) - ,@body)) - (do ((,sexpr (read ,stream nil *eof-object*) - (read ,stream nil *eof-object*))) - ((eq ,sexpr *eof-object*)) - ,@body)))))) - (do-sexprs (sexpr stream) + (macrolet + ((do-sexprs (((sexpr index) stream) &body body) + (aver (symbolp sexpr)) + (with-unique-names (source-info) + (once-only ((stream stream)) + `(if (handler-case (pathname stream) + (error () nil)) + (let* ((,source-info (sb!c::make-file-source-info + (pathname ,stream) + (stream-external-format ,stream))) + (sb!c::*source-info* ,source-info) + (sb!c::*source-paths* (make-hash-table :test 'eq))) + (setf (sb!c::source-info-stream ,source-info) ,stream) + (sb!c::do-forms-from-info ((,sexpr current-index) + ,source-info) + (sb!c::find-source-paths ,sexpr current-index) + (let ((,index current-index)) + ,@body))) + (let ((sb!c::*source-info* nil) + (,index nil)) + (do ((,sexpr (read ,stream nil *eof-object*) + (read ,stream nil *eof-object*))) + ((eq ,sexpr *eof-object*)) + ,@body))))))) + (do-sexprs ((sexpr tlf-index) stream) (if print - (let ((results (multiple-value-list (eval sexpr)))) + (let ((results (multiple-value-list (eval-tlf sexpr tlf-index)))) (load-fresh-line) (format t "~{~S~^, ~}~%" results)) - (eval sexpr))) + (eval-tlf sexpr tlf-index))) t)) ;;;; LOAD itself @@ -139,8 +147,11 @@ (return-from load nil)) (let* ((real (probe-file stream)) (should-be-fasl-p - (and real (string= (pathname-type real) *fasl-file-type*)))) - (when (fasl-header-p stream :errorp should-be-fasl-p) + (and real (string-equal (pathname-type real) *fasl-file-type*)))) + ;; Don't allow empty .fasls, and assume other empty files + ;; are source files. + (when (and (or should-be-fasl-p (not (eql 0 (file-length stream)))) + (fasl-header-p stream :errorp should-be-fasl-p)) (return-from load (load-stream stream t))))) ;; Case 3: Open using the gived external format, process as source. (with-open-file (stream pathname :external-format external-format)