refactor GET-TOPLEVEL-FORM &co between debugger and disassembler
[sbcl.git] / src / code / reader.lisp
index 77ab6f0..5d85c73 100644 (file)
@@ -904,6 +904,8 @@ standard Lisp readtable when NIL."
                (cond (all-lower (raise-em))
                      (all-upper (lower-em))))))))))))
 
+(defvar *reader-package* nil)
+
 (defun read-token (stream firstchar)
   #!+sb-doc
   "Default readmacro function. Handles numbers, symbols, and SBCL's
@@ -1262,7 +1264,7 @@ extended <package-name>::<form-in-package> syntax."
         (#.+char-attr-delimiter+
          (unread-char char stream)
          (if package-designator
-             (let ((*package* (%find-package-or-lose package-designator)))
+             (let* ((*reader-package* (%find-package-or-lose package-designator)))
                (return (read stream t nil t)))
              (simple-reader-error stream
                                   "illegal terminating character after a double-colon: ~S"
@@ -1277,8 +1279,13 @@ extended <package-name>::<form-in-package> syntax."
       RETURN-SYMBOL
       (casify-read-buffer escapes)
       (let ((found (if package-designator
-                       (%find-package-or-lose package-designator)
-                       (sane-package))))
+                       (or (find-package package-designator)
+                           (error 'simple-reader-package-error
+                                  :package package-designator
+                                  :stream stream
+                                  :format-control "Package ~A does not exist."
+                                  :format-arguments (list package-designator)))
+                       (or *reader-package* (sane-package)))))
         (if (or (zerop colons) (= colons 2) (eq found *keyword-package*))
             (return (intern* *read-buffer* *ouch-ptr* found))
             (multiple-value-bind (symbol test)
@@ -1286,7 +1293,9 @@ extended <package-name>::<form-in-package> syntax."
               (when (eq test :external) (return symbol))
               (let ((name (read-buffer-to-string)))
                 (with-simple-restart (continue "Use symbol anyway.")
-                  (error 'simple-reader-package-error :stream stream
+                  (error 'simple-reader-package-error
+                         :package found
+                         :stream stream
                          :format-arguments (list name (package-name found))
                          :format-control
                          (if test