(declare (fixnum old-length new-length))
(with-array-data ((old-data array) (old-start)
(old-end old-length))
- (cond ((or (%array-displaced-p array)
+ (cond ((or (and (array-header-p array)
+ (%array-displaced-p array))
(< old-length new-length))
(setf new-data
(data-vector-from-inits
(with-array-data ((old-data array) (old-start)
(old-end old-length))
(declare (ignore old-end))
- (let ((new-data (if (or (%array-displaced-p array)
+ (let ((new-data (if (or (and (array-header-p array)
+ (%array-displaced-p array))
(> new-length old-length))
(data-vector-from-inits
dimensions new-length
fill-pointer))))
;;; Destructively alter VECTOR, changing its length to NEW-LENGTH,
-;;; which must be less than or equal to its current length.
-(defun shrink-vector (vector new-length)
+;;; which must be less than or equal to its current length. This can
+;;; be called on vectors without a fill pointer but it is extremely
+;;; dangerous to do so: shrinking the size of an object (as viewed by
+;;; the gc) makes bounds checking unreliable in the face of interrupts
+;;; or multi-threading. Call it only on provably local vectors.
+(defun %shrink-vector (vector new-length)
(declare (vector vector))
(unless (array-header-p vector)
(macrolet ((frob (name &rest things)
,fill-value
:start new-length))))
things))))
+ ;; Set the 'tail' of the vector to the appropriate type of zero,
+ ;; "because in some cases we'll scavenge larger areas in one go,
+ ;; like groups of pages that had triggered the write barrier, or
+ ;; the whole static space" according to jsnell.
#.`(frob vector
,@(map 'list
(lambda (saetp)
(setf (%array-fill-pointer vector) new-length)
vector)
+(defun shrink-vector (vector new-length)
+ (declare (vector vector))
+ (cond ((eq (length vector) new-length)
+ vector)
+ ((array-has-fill-pointer-p vector)
+ (setf (%array-fill-pointer vector) new-length))
+ (t (subseq vector 0 new-length))))
+
;;; Fill in array header with the provided information, and return the array.
(defun set-array-header (array data length fill-pointer displacement dimensions
&optional displacedp)
:complaint "backslash in a bad place"
:namestring namestr
:offset (1- end)))
- (shrink-vector result dst)))
+ (%shrink-vector result dst)))
(defvar *ignore-wildcards* nil)
((zerop q)
(incf i)
(replace res res :start2 i :end2 len)
- (shrink-vector res (- len i)))
+ (%shrink-vector res (- len i)))
(declare (simple-string res)
(fixnum len i r q))
(multiple-value-setq (q r) (truncate q 10))
(= number-zapped count))
(do ((index index (,bump index))
(new-index new-index (,bump new-index)))
- ((= index (the fixnum ,right)) (shrink-vector result new-index))
+ ((= index (the fixnum ,right)) (%shrink-vector result new-index))
(declare (fixnum index new-index))
(setf (aref result new-index) (aref sequence index))))
(declare (fixnum index new-index number-zapped))
(setf (aref result jndex) (aref vector index))
(setq index (1+ index))
(setq jndex (1+ jndex)))
- (shrink-vector result jndex)))
+ (%shrink-vector result jndex)))
(define-sequence-traverser remove-duplicates
(sequence &key test test-not start end from-end key)
(cond (ch
(when (char= ch #\newline)
(done-with-fast-read-char)
- (return (values (shrink-vector res index) nil)))
+ (return (values (%shrink-vector res index) nil)))
(when (= index len)
(setq len (* len 2))
(let ((new (make-string len)))
;; shouldn't do another READ-CHAR.
(t
(done-with-fast-read-char)
- (return (values (shrink-vector res index) t)))))))))
+ (return (values (%shrink-vector res index) t)))))))))
(defun read-line (&optional (stream *standard-input*) (eof-error-p t) eof-value
recursive-p)
(setf (hash-table-next-vector table) new-next-vector)
(setf (hash-table-hash-vector table) new-hash-vector)
;; Shrink the old vectors to 0 size to help the conservative GC.
- (shrink-vector old-kv-vector 0)
- (shrink-vector old-index-vector 0)
- (shrink-vector old-next-vector 0)
+ (%shrink-vector old-kv-vector 0)
+ (%shrink-vector old-index-vector 0)
+ (%shrink-vector old-next-vector 0)
(when old-hash-vector
- (shrink-vector old-hash-vector 0))
+ (%shrink-vector old-hash-vector 0))
(setf (hash-table-rehash-trigger table) new-size))
(values))
`(the ,(type-specifier declared-element-ctype)
,bare-form)))))))
+;;; Transform multi-dimensional to one dimensional SIMPLE-ARRAY
+;;; access.
(deftransform data-vector-ref ((array index)
(simple-array t))
(let ((array-type (lvar-type array)))
(loop
(let ((ch (stream-read-char stream)))
(cond ((eq ch :eof)
- (return (values (shrink-vector res index) t)))
+ (return (values (%shrink-vector res index) t)))
(t
(when (char= ch #\newline)
- (return (values (shrink-vector res index) nil)))
+ (return (values (%shrink-vector res index) nil)))
(when (= index len)
(setq len (* len 2))
(let ((new (make-string len)))
(defun send-gc ()
(loop until (< *n-gcs-done* *n-gcs-requested*))
- (format t "G" *n-gcs-requested* *n-gcs-done*)
+ (format t "G")
(force-output)
(sb-ext:gc)
(incf *n-gcs-done*))
;;; 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".)
-"0.9.6.52"
+"0.9.6.53"