;;; 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))
\f
;;;; LOAD itself
(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)