1.0.48.3: source-locations from LOAD of source files, and EVAL-WHEN :COMPILE-TOPLEVEL
[sbcl.git] / src / code / target-load.lisp
index d022e55..6f2912e 100644 (file)
 ;;; 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)