From aaaec08b138d6e23c2ac6cc8d2145673a01a95c6 Mon Sep 17 00:00:00 2001 From: William Harold Newman Date: Wed, 20 Feb 2002 18:41:51 +0000 Subject: [PATCH] 0.7.1.22: merged CSR patch I and II: "CATCH and gc" 2002-02-18 merged CSR patch III: "lowtag horribleness" 2002-02-19 --- BUGS | 19 +++++++++++++++++++ src/compiler/alpha/nlx.lisp | 2 +- src/compiler/generic/early-objdef.lisp | 9 +++++++++ src/compiler/sparc/nlx.lisp | 2 +- src/runtime/gc.c | 7 +++++-- version.lisp-expr | 2 +- 6 files changed, 36 insertions(+), 5 deletions(-) diff --git a/BUGS b/BUGS index 0f4e0ce..7f00c53 100644 --- a/BUGS +++ b/BUGS @@ -1299,6 +1299,25 @@ WORKAROUND: them as TYPE-ERRORs (reporting the problem as something not being coerceable to a function). +153: + (essentially the same problem as a CMU CL bug reported by Martin + Cracauer on cmucl-imp 2002-02-19) + There is a hole in structure slot type checking. Compiling and LOADing + (declaim (optimize safety)) + (defstruct foo + (bla 0 :type fixnum)) + (defun f () + (let ((foo (make-foo))) + (setf (foo-bla foo) '(1 . 1)) + (format t "Is ~a of type ~a a cons? => ~a~%" + (foo-bla foo) + (type-of (foo-bla foo)) + (consp (foo-bla foo))))) + (f) + should signal an error, but in sbcl-0.7.1.21 instead gives the output + Is (1 . 1) of type CONS a cons? => NIL + without signalling an error. + DEFUNCT CATEGORIES OF BUGS IR1-#: diff --git a/src/compiler/alpha/nlx.lisp b/src/compiler/alpha/nlx.lisp index 654d39d..e11c746 100644 --- a/src/compiler/alpha/nlx.lisp +++ b/src/compiler/alpha/nlx.lisp @@ -105,7 +105,7 @@ ;;; specified tag, and link the block into the Current-Catch list. (define-vop (make-catch-block) (:args (tn) - (tag :scs (descriptor-reg))) + (tag :scs (any-reg descriptor-reg))) (:info entry-label) (:results (block :scs (any-reg))) (:temporary (:scs (descriptor-reg)) temp) diff --git a/src/compiler/generic/early-objdef.lisp b/src/compiler/generic/early-objdef.lisp index 7407e4a..fb4deda 100644 --- a/src/compiler/generic/early-objdef.lisp +++ b/src/compiler/generic/early-objdef.lisp @@ -27,6 +27,15 @@ ;;; * LIST-POINTER-LOWTAG + 4 = OTHER-POINTER-LOWTAG: NIL is both a ;;; cons and a symbol (at the same address) and depends on this. ;;; See the definition of SYMBOL in objdef.lisp +;;; * OTHER-POINTER-LOWTAG > 4: Some code in the SPARC backend, +;;; which uses bit 2 of the ALLOC register to indicate that +;;; PSEUDO-ATOMIC is on, doesn't strip the low bits of reg_ALLOC +;;; before ORing in OTHER-POINTER-LOWTAG within a PSEUDO-ATOMIC +;;; section. +;;; (These are just the ones we know about as of sbcl-0.7.1.22. There +;;; might easily be more, since these values have stayed highly +;;; constrained for more than a decade, an inviting target for +;;; inventive abstraction-phobic maintainers.:-) (eval-when (:compile-toplevel :load-toplevel :execute) ;; The EVAL-WHEN is necessary (at least for Lispworks), because the ;; second DEFENUM uses the value of OTHER-IMMEDIATE-0-LOWTAG, which is diff --git a/src/compiler/sparc/nlx.lisp b/src/compiler/sparc/nlx.lisp index 2b63b13..5e67c47 100644 --- a/src/compiler/sparc/nlx.lisp +++ b/src/compiler/sparc/nlx.lisp @@ -101,7 +101,7 @@ ;;; link the block into the Current-Catch list. (define-vop (make-catch-block) (:args (tn) - (tag :scs (descriptor-reg))) + (tag :scs (any-reg descriptor-reg))) (:info entry-label) (:results (block :scs (any-reg))) (:temporary (:scs (descriptor-reg)) temp) diff --git a/src/runtime/gc.c b/src/runtime/gc.c index 06b8d26..fdf9ed1 100644 --- a/src/runtime/gc.c +++ b/src/runtime/gc.c @@ -28,9 +28,8 @@ #include "interr.h" /* So you need to debug? */ -#define PRINTNOISE -#define DEBUG_SPACE_PREDICATES #if 0 +#define PRINTNOISE #define DEBUG_SPACE_PREDICATES #define DEBUG_SCAVENGE_VERBOSE #define DEBUG_COPY_VERBOSE @@ -511,7 +510,9 @@ scavenge_interrupt_context(os_context_t *context) #ifdef ARCH_HAS_NPC_REGISTER unsigned long npc_code_offset; #endif +#ifdef DEBUG_SCAVENGE_VERBOSE fprintf(stderr, "Scavenging interrupt context at 0x%x\n",context); +#endif /* Find the LIP's register pair and calculate its offset */ /* before we scavenge the context. */ #ifdef reg_LIP @@ -603,7 +604,9 @@ void scavenge_interrupt_contexts(void) index = fixnum_value(SymbolValue(FREE_INTERRUPT_CONTEXT_INDEX)); +#ifdef DEBUG_SCAVENGE_VERBOSE fprintf(stderr, "%d interrupt contexts to scan\n",index); +#endif for (i = 0; i < index; i++) { context = lisp_interrupt_contexts[i]; scavenge_interrupt_context(context); diff --git a/version.lisp-expr b/version.lisp-expr index 8cb613b..493a90c 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.7.1.21" +"0.7.1.22" -- 1.7.10.4