0.pre7.86.flaky7.26:
authorWilliam Harold Newman <william.newman@airmail.net>
Sat, 8 Dec 2001 22:24:15 +0000 (22:24 +0000)
committerWilliam Harold Newman <william.newman@airmail.net>
Sat, 8 Dec 2001 22:24:15 +0000 (22:24 +0000)
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.

BUGS
TODO
src/code/cold-init.lisp
src/code/toplevel.lisp
version.lisp-expr

diff --git a/BUGS b/BUGS
index 3231df6..cce7d24 100644 (file)
--- 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 (file)
--- 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:
 
index 1e4a912..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))
-
 (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
   (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)
 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
 
index 85bc4c8..5a40e8f 100644 (file)
       (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)
        (- 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")
index 350fa31..d28920b 100644 (file)
@@ -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"