0.pre7.86.flaky7.26:
[sbcl.git] / src / code / cold-init.lisp
index 6d10a6a..2390630 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))
-
-#!+gengc
-(defun !do-load-time-value-fixup (object offset index)
-  (declare (type index offset))
-  (let ((value (svref *!load-time-values* index)))
-    (typecase object
-      (list
-       (case offset
-        (0 (setf (car object) value))
-        (1 (setf (cdr object) value))
-        (t (!cold-lose "bogus offset in cons cell"))))
-      (instance
-       (setf (%instance-ref object (- offset sb!vm:instance-slots-offset))
-            value))
-      (code-component
-       (setf (code-header-ref object offset) value))
-      (simple-vector
-       (setf (svref object (- offset sb!vm:vector-data-offset)) value))
-      (t
-       (!cold-lose "unknown kind of object for load-time-value fixup")))))
-
 (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
   ;; !UNIX-COLD-INIT. And *TYPE-SYSTEM-INITIALIZED* could be changed to
   ;; *TYPE-SYSTEM-INITIALIZED-WHEN-BOUND* so that it doesn't need to
   ;; be explicitly set in order to be meaningful.
-  (setf *gc-notify-stream* nil)
-  (setf *before-gc-hooks* nil)
-  (setf *after-gc-hooks* nil)
-  #!+gengc (setf *handler-clusters* nil)
-  #!-gengc (setf *already-maybe-gcing* t
-                *gc-inhibit* t
-                *need-to-collect-garbage* nil
-                sb!unix::*interrupts-enabled* t
-                sb!unix::*interrupt-pending* nil)
-  (setf *break-on-signals* nil)
-  (setf *maximum-error-depth* 10)
-  (setf *current-error-depth* 0)
-  (setf *cold-init-complete-p* nil)
-  (setf *type-system-initialized* nil)
+  (setf *gc-notify-stream* nil
+        *before-gc-hooks* nil
+        *after-gc-hooks* nil
+        *already-maybe-gcing* t
+       *gc-inhibit* t
+       *need-to-collect-garbage* nil
+       sb!unix::*interrupts-enabled* t
+       sb!unix::*interrupt-pending* nil
+        *break-on-signals* nil
+        *maximum-error-depth* 10
+        *current-error-depth* 0
+        *cold-init-complete-p* nil
+        *type-system-initialized* nil)
+
+  (show-and-call !typecheckfuns-cold-init)
 
   ;; Anyone might call RANDOM to initialize a hash value or something;
   ;; and there's nothing which needs to be initialized in order for
            (setf (svref *!load-time-values* (third toplevel-thing))
                  (funcall (second toplevel-thing))))
           (:load-time-value-fixup
-           #!-gengc
            (setf (sap-ref-32 (second toplevel-thing) 0)
                  (get-lisp-obj-address
-                  (svref *!load-time-values* (third toplevel-thing))))
-           #!+gengc
-           (!do-load-time-value-fixup (second toplevel-thing)
-                                      (third  toplevel-thing)
-                                      (fourth toplevel-thing)))
+                  (svref *!load-time-values* (third toplevel-thing)))))
           #!+(and x86 gencgc)
           (:load-time-code-fixup
            (sb!vm::!do-load-time-code-fixup (second toplevel-thing)
 
   ;; 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)
 
   ;; The system is finally ready for GC.
-  #!-gengc (setf *already-maybe-gcing* nil)
+  (setf *already-maybe-gcing* nil)
   (/show0 "enabling GC")
   (gc-on)
   (/show0 "doing first GC")
   (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)
   "Terminate the current Lisp. Things are cleaned up (with UNWIND-PROTECT
   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-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