From: William Harold Newman Date: Sat, 8 Dec 2001 22:24:15 +0000 (+0000) Subject: 0.pre7.86.flaky7.26: X-Git-Url: http://repo.macrolet.net/gitweb/?a=commitdiff_plain;h=5277a0cbf1a72243cad6808883a4847acefc8e6b;p=sbcl.git 0.pre7.86.flaky7.26: Duh. WITH-SIMPLE-RESTART doesn't restart its operation. So it's not a compiler bug, just the lack of an outer LOOP wrapper in TOPLEVEL-REPL, which has been blowing the system up. Gads. --- diff --git a/BUGS b/BUGS index 3231df6..cce7d24 100644 --- a/BUGS +++ b/BUGS @@ -1325,6 +1325,16 @@ Error in function C::GET-LAMBDA-TO-COMPILE: Interior call of BACKQUOTIFY erroneously optimizes ,@': it immediately splices the temporal representation of ,@S. +135: + Ideally, uninterning a symbol would allow it, and its associated + FDEFINITION and PROCLAIM data, to be reclaimed by the GC. However, + at least as of sbcl-0.7.0, this isn't the case. Information about + FDEFINITIONs and PROCLAIMed properties is stored in globaldb.lisp + essentially in ordinary (non-weak) hash tables keyed by symbols. + Thus, once a system has an entry in this system, it tends to live + forever, even when it is uninterned and all other references to it + are lost. + KNOWN BUGS RELATED TO THE IR1 INTERPRETER diff --git a/TODO b/TODO index a06c409..b7e98cc 100644 --- a/TODO +++ b/TODO @@ -87,7 +87,7 @@ for early 0.7.x: * Probably get rid of or at least rework the fdefinition/encapsulation system so that (SYMBOL-FUNCTION 'FOO) = (FDEFINITION 'FOO). ======================================================================= -for 1.0: +for 0.9: * refactored in preparation for moving CLOS into cold init and merging SB-PCL:FOO with CL:FOO (for FOO=CLASS, FOO=CLASS-OF, etc.) @@ -132,6 +132,10 @@ for 1.0: between minor maintenance releases on the stable branch (but no promises, sorry, since I've never tried to do this before, and have no idea how much of a pain this'll be) +======================================================================== +for 1.0 (fixes of lower priority which I'd nonetheless be embarrassed +to leave unfixed in 1.0): +* all too many BUGS entries and FIXMEs ======================================================================= other priorities, no particular time: diff --git a/src/code/cold-init.lisp b/src/code/cold-init.lisp index 1e4a912..2390630 100644 --- a/src/code/cold-init.lisp +++ b/src/code/cold-init.lisp @@ -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) @@ -37,6 +40,23 @@ (unless any-changes? (return)))) +;;;; 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)) + ;;;; !COLD-INIT ;;; a list of toplevel things set by GENESIS @@ -45,11 +65,6 @@ ;;; 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 @@ -230,7 +245,8 @@ (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) @@ -249,7 +265,8 @@ 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")) ;;;; initialization functions diff --git a/src/code/toplevel.lisp b/src/code/toplevel.lisp index 85bc4c8..5a40e8f 100644 --- a/src/code/toplevel.lisp +++ b/src/code/toplevel.lisp @@ -452,7 +452,9 @@ (flush-standard-output-streams) (/show0 "falling into TOPLEVEL-REPL from TOPLEVEL-INIT") - (toplevel-repl noprint)))) + (toplevel-repl noprint) + ;; (classic CMU CL error message: "You're certainly a clever child.":-) + (critically-unreachable "after TOPLEVEL-REPL")))) ;;; read-eval-print loop for the default system toplevel (defun toplevel-repl (noprint) @@ -461,20 +463,30 @@ (- nil) (+ nil) (++ nil) (+++ nil) (/// nil) (// nil) (/ nil)) - (/show0 "about to set up restarts in TOPLEVEL-REPL") - ;; There should only be one TOPLEVEL restart, and it's here, so - ;; restarting at TOPLEVEL always bounces you all the way out here. - (with-simple-restart (toplevel - "Restart at toplevel READ/EVAL/PRINT loop.") - ;; We add a new ABORT restart for every debugger level, so - ;; restarting at ABORT in a nested debugger gets you out to the - ;; innermost enclosing debugger, and only when you're in the - ;; outermost, unnested debugger level does restarting at ABORT - ;; get you out to here. - (with-simple-restart (abort "Reduce debugger level (leaving debugger).") - (catch 'toplevel-catcher - (sb!unix:unix-sigsetmask 0) ; FIXME: What is this for? - (repl noprint)))))) + ;; WITH-SIMPLE-RESTART doesn't actually restart its body as some + ;; (like WHN for an embarrassingly long time ca. 2001-12-07) might + ;; think, but instead drops control back out at the end. So when a + ;; TOPLEVEL or outermost-ABORT restart happens, we need this outer + ;; LOOP wrapper to grab control and start over again. (And it also + ;; wraps CATCH 'TOPLEVEL-CATCHER for similar reasons.) + (loop + (/show0 "about to set up restarts in TOPLEVEL-REPL") + ;; There should only be one TOPLEVEL restart, and it's here, so + ;; restarting at TOPLEVEL always bounces you all the way out here. + (with-simple-restart (toplevel + "Restart at toplevel READ/EVAL/PRINT loop.") + ;; We add a new ABORT restart for every debugger level, so + ;; restarting at ABORT in a nested debugger gets you out to the + ;; innermost enclosing debugger, and only when you're in the + ;; outermost, unnested debugger level does restarting at ABORT + ;; get you out to here. + (with-simple-restart + (abort + "Reduce debugger level (leaving debugger, returning to toplevel).") + (catch 'toplevel-catcher + (sb!unix:unix-sigsetmask 0) ; FIXME: What is this for? + (repl noprint) + (critically-unreachable "after REPL"))))))) (defun repl (noprint) (/show0 "entering REPL") diff --git a/version.lisp-expr b/version.lisp-expr index 350fa31..d28920b 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -18,4 +18,4 @@ ;;; for internal versions, especially for internal versions off the ;;; main CVS branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".) -"0.pre7.86.flaky7.25" +"0.pre7.86.flaky7.26"