X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fsort.lisp;h=1d6949f4c41c65d7e0dff03f284009be1c65d8d6;hb=496071a75429677a2c064e4995c379d3ba6ec458;hp=e285dabe13d229540b6a7719bda4ff8dc43283c3;hpb=9e508b594433a9312890e4ae60d62302bd10b483;p=sbcl.git diff --git a/src/code/sort.lisp b/src/code/sort.lisp index e285dab..1d6949f 100644 --- a/src/code/sort.lisp +++ b/src/code/sort.lisp @@ -31,8 +31,9 @@ (if key (%coerce-callable-to-fun key) #'identity)) (let ((key-fun-or-nil (and key (%coerce-callable-to-fun key)))) (with-array-data ((vector (the vector sequence)) - (start 0) - (end (length sequence))) + (start) + (end) + :check-fill-pointer t) (sort-vector vector start end predicate-fun key-fun-or-nil)) sequence) (apply #'sb!sequence:sort sequence predicate args)))) @@ -239,8 +240,8 @@ (simple-vector ,temp)) (when (> ,vector-len ,temp-len) (setf ,temp (make-array (max ,vector-len - (min most-positive-fixnum - (+ ,temp-len ,temp-len)))) + (min (truncate array-dimension-limit 2) + (logand most-positive-fixnum (+ ,temp-len ,temp-len))))) *merge-sort-temp-vector* ,temp)) ;; Rebind, in case PRED or KEY calls STABLE-SORT. This is also ;; interrupt safe: we bind before we put any data of our own in @@ -296,10 +297,6 @@ ) ; EVAL-when -;;; temporary vector for stable sorting vectors, allocated for each new thread -(defvar *merge-sort-temp-vector* (vector)) -(declaim (simple-vector *merge-sort-temp-vector*)) - (defun stable-sort-simple-vector (vector pred key) (declare (type simple-vector vector) (type function pred)