;;; 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
;; 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