1.0.25.50 exposed a bug in the print-object discriminating
function: we need to have the methods for critical printing at
all times, but the implementation allowed other methods into
that initial cache, which was wrong if those methods
were subsequently invalidated. The fix is to keep the initial
cache pristine and to use only copies in the print-object
generic function itself.
* bug fix: timers could go off in the wrong order, be delayed indefinitely
(thanks to Ole Arndt for the patch)
* bug fix: RESTART-FRAME and RETURN-FROM-FRAME stack corruption
* bug fix: timers could go off in the wrong order, be delayed indefinitely
(thanks to Ole Arndt for the patch)
* bug fix: RESTART-FRAME and RETURN-FROM-FRAME stack corruption
+ * bug fix: the discriminating function for PRINT-OBJECT no longer preserves
+ potentially-invalid effective methods in its cache.
changes in sbcl-1.0.27 relative to 1.0.26:
* new port: support added for x86-64 OpenBSD. (thanks to Josh Elsasser)
changes in sbcl-1.0.27 relative to 1.0.26:
* new port: support added for x86-64 OpenBSD. (thanks to Josh Elsasser)
(eq gf #'(setf slot-value-using-class))
(eq gf #'slot-boundp-using-class)))
(eq gf #'(setf slot-value-using-class))
(eq gf #'slot-boundp-using-class)))
+(let (initial-print-object-cache)
(defmethod compute-discriminating-function ((gf standard-generic-function))
(let ((dfun-state (slot-value gf 'dfun-state)))
(when (special-case-for-compute-discriminating-function-p gf)
(defmethod compute-discriminating-function ((gf standard-generic-function))
(let ((dfun-state (slot-value gf 'dfun-state)))
(when (special-case-for-compute-discriminating-function-p gf)
(cond ((/= nkeys 1)
;; KLUDGE: someone has defined a method
;; specialized on the second argument: punt.
(cond ((/= nkeys 1)
;; KLUDGE: someone has defined a method
;; specialized on the second argument: punt.
+ (setf initial-print-object-cache nil)
+ (initial-print-object-cache
(multiple-value-bind (dfun cache info)
(multiple-value-bind (dfun cache info)
- (make-caching-dfun gf po-cache)
+ (make-caching-dfun gf (copy-cache initial-print-object-cache))
(set-dfun gf dfun cache info)))
;; the relevant PRINT-OBJECT methods get defined
;; late, by delayed DEF!METHOD. We mustn't cache
(set-dfun gf dfun cache info)))
;; the relevant PRINT-OBJECT methods get defined
;; late, by delayed DEF!METHOD. We mustn't cache
(t (multiple-value-bind (dfun cache info)
(make-final-dfun-internal
gf
(t (multiple-value-bind (dfun cache info)
(make-final-dfun-internal
gf
- (list (list (find-class
- 'sb-kernel::control-stack-exhausted))
- (list (find-class
- 'sb-kernel::binding-stack-exhausted))
- (list (find-class
- 'sb-kernel::alien-stack-exhausted))
- (list (find-class
- 'sb-kernel::heap-exhausted-error))
- (list (find-class 'restart))))
- (setq po-cache cache)
- (set-dfun gf dfun cache info))))))
+ (mapcar (lambda (x) (list (find-class x)))
+ '(sb-kernel::control-stack-exhausted
+ sb-kernel::binding-stack-exhausted
+ sb-kernel::alien-stack-exhausted
+ sb-kernel::heap-exhausted-error
+ restart)))
+ (setq initial-print-object-cache cache)
+ (set-dfun gf dfun (copy-cache cache) info))))))
((gf-precompute-dfun-and-emf-p (slot-value gf 'arg-info))
(make-final-dfun gf))
(t
((gf-precompute-dfun-and-emf-p (slot-value gf 'arg-info))
(make-final-dfun gf))
(t
;;; checkins which aren't released. (And occasionally for internal
;;; versions, especially for internal versions off the main CVS
;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
;;; checkins which aren't released. (And occasionally for internal
;;; versions, especially for internal versions off the main CVS
;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)