0.pre7.138:
[sbcl.git] / src / code / cold-init.lisp
index 0a911ff..e6d99a1 100644 (file)
@@ -21,6 +21,9 @@
 ;;; which might be tedious to maintain, instead we use a hack:
 ;;; anything whose name matches a magic character pattern is
 ;;; uninterned.
+;;;
+;;; FIXME: should also go through globaldb (and perhaps other tables)
+;;; blowing away associated entries
 (defun !unintern-init-only-stuff ()
   (do ((any-changes? nil nil))
       (nil)
     (unless any-changes?
       (return))))
 \f
+;;;; putting ourselves out of our misery when things become too much to bear
+
+(declaim (ftype (function (simple-string) nil) critically-unreachable))
+(defun !cold-lose (msg)
+  (%primitive print msg)
+  (%primitive print "too early in cold init to recover from errors")
+  (%halt))
+
+;;; last-ditch error reporting for things which should never happen
+;;; and which, if they do happen, are sufficiently likely to torpedo
+;;; the normal error-handling system that we want to bypass it
+(declaim (ftype (function (simple-string) nil) critically-unreachable))
+(defun critically-unreachable (where)
+  (%primitive print "internal error: Control should never reach here, i.e.")
+  (%primitive print where)
+  (%halt))
+\f
 ;;;; !COLD-INIT
 
 ;;; a list of toplevel things set by GENESIS
 ;;; a SIMPLE-VECTOR set by GENESIS
 (defvar *!load-time-values*)
 
-(defun !cold-lose (msg)
-  (%primitive print msg)
-  (%primitive print "too early in cold init to recover from errors")
-  (%halt))
-
 (eval-when (:compile-toplevel :execute)
   ;; FIXME: Perhaps we should make SHOW-AND-CALL-AND-FMAKUNBOUND, too,
   ;; and use it for most of the cold-init functions. (Just be careful
                   (svref *!load-time-values* (third toplevel-thing)))))
           #!+(and x86 gencgc)
           (:load-time-code-fixup
-           (sb!vm::!do-load-time-code-fixup (second toplevel-thing)
-                                            (third  toplevel-thing)
-                                            (fourth toplevel-thing)
-                                            (fifth  toplevel-thing)))
+           (sb!vm::!envector-load-time-code-fixup (second toplevel-thing)
+                                                  (third  toplevel-thing)
+                                                  (fourth toplevel-thing)
+                                                  (fifth  toplevel-thing)))
           (t
            (!cold-lose "bogus fixup code in *!REVERSED-COLD-TOPLEVELS*"))))
        (t (!cold-lose "bogus function in *!REVERSED-COLD-TOPLEVELS*")))))
 
   ;; the ANSI-specified initial value of *PACKAGE*
   (setf *package* (find-package "COMMON-LISP-USER"))
-  ;; FIXME: I'm not sure where it should be done, but CL-USER really
-  ;; ought to USE-PACKAGE publicly accessible packages like SB-DEBUG
-  ;; (for ARG and VAR), SB-EXT, SB-EXT-C-CALL, and SB-EXT-ALIEN so
-  ;; that the user has a hint about which symbols we consider public.
-  ;; (Perhaps SB-DEBUG wouldn't need to be in the list if ARG and VAR
-  ;; could be typed directly, with no parentheses, at the debug prompt
-  ;; the way that e.g. F or BACKTRACE can be?)
 
   (/show0 "done initializing, setting *COLD-INIT-COMPLETE-P*")
   (setf *cold-init-complete-p* t)
   (terpri)
   (/show0 "going into toplevel loop")
   (handling-end-of-the-world 
-    (toplevel-init)))
+    (toplevel-init)
+    (critically-unreachable "after TOPLEVEL-INIT")))
 
 (defun quit (&key recklessly-p
                  (unix-code 0 unix-code-p)
   and so forth) unless RECKLESSLY-P is non-NIL. On UNIX-like systems,
   UNIX-STATUS is used as the status code."
   (declare (type (signed-byte 32) unix-status unix-code))
+  (/show0 "entering QUIT")
   ;; FIXME: UNIX-CODE was deprecated in sbcl-0.6.8, after having been
   ;; around for less than a year. It should be safe to remove it after
   ;; a year.
 instead (which is another name for the same thing)."))
   (if recklessly-p
       (sb!unix:unix-exit unix-status)
-      (throw '%end-of-the-world unix-status)))
+      (throw '%end-of-the-world unix-status))
+  (critically-unreachable "after trying to die in QUIT"))
 \f
 ;;;; initialization functions