X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Farray.lisp;h=1df47c51f1fa5981add7329390e6e7843c5051b4;hb=53ab0266f9a92943cc93f675cc727d01cfa55474;hp=b1239ca8a2e56ea4663a94b148bd4246fc24be6d;hpb=4191783c20fc6f86afe4b3fe73e79b075a08cc43;p=sbcl.git diff --git a/src/code/array.lisp b/src/code/array.lisp index b1239ca..1df47c5 100644 --- a/src/code/array.lisp +++ b/src/code/array.lisp @@ -476,6 +476,14 @@ of specialized arrays is supported." (defun data-vector-ref-with-offset (array index offset) (hairy-data-vector-ref array (+ index offset))) +(declaim (ftype (function (array integer integer &optional t) nil) signal-invalid-array-index-error)) +(defun invalid-array-index-error (array index bound &optional axis) + (error 'invalid-array-index-error + :array array + :axis axis + :datum index + :expected-type `(integer 0 (,bound)))) + ;;; SUBSCRIPTS has a dynamic-extent list structure and is destroyed (defun %array-row-major-index (array subscripts &optional (invalid-index-error-p t)) @@ -497,11 +505,7 @@ of specialized arrays is supported." (declare (fixnum dim)) (unless (and (fixnump index) (< -1 index dim)) (if invalid-index-error-p - (error 'simple-type-error - :format-control "invalid index ~W~[~;~:; on axis ~:*~W~] in ~S" - :format-arguments (list index axis array) - :datum index - :expected-type `(integer 0 (,dim))) + (invalid-array-index-error array index dim axis) (return-from %array-row-major-index nil))) (incf result (* chunk-size (the fixnum index))) (setf chunk-size (* chunk-size dim)))) @@ -509,14 +513,7 @@ of specialized arrays is supported." (length (length (the (simple-array * (*)) array)))) (unless (and (fixnump index) (< -1 index length)) (if invalid-index-error-p - ;; FIXME: perhaps this should share a format-string - ;; with INVALID-ARRAY-INDEX-ERROR or - ;; INDEX-TOO-LARGE-ERROR? - (error 'simple-type-error - :format-control "invalid index ~W in ~S" - :format-arguments (list index array) - :datum index - :expected-type `(integer 0 (,length))) + (invalid-array-index-error array index length) (return-from %array-row-major-index nil))) index)))) @@ -1085,28 +1082,27 @@ of specialized arrays is supported." array) ;;; User visible extension -(declaim (ftype (function (simple-array) (values (simple-array * (*)) &optional)) - simple-array-vector)) -(defun simple-array-vector (array) - "Returns the one-dimensional SIMPLE-ARRAY corresponding to ARRAY. - -The ARRAY must be a SIMPLE-ARRAY. If ARRAY is multidimensional, returns the -underlying one-dimensional SIMPLE-ARRAY which shares storage with ARRAY. -Otherwise returns ARRAY. +(declaim (ftype (function (array) (values (simple-array * (*)) &optional)) + array-storage-vector)) +(defun array-storage-vector (array) + "Returns the underlying storage vector of ARRAY, which must be a non-displaced array. -Currently in SBCL a multidimensional SIMPLE-ARRAY has an underlying -one-dimensional SIMPLE-ARRAY, which holds the data in row major order. This -function provides access to that vector. +In SBCL, if ARRAY is a of type \(SIMPLE-ARRAY * \(*)), it is its own storage +vector. Multidimensional arrays, arrays with fill pointers, and adjustable +arrays have an underlying storage vector with the same ARRAY-ELEMENT-TYPE as +ARRAY, which this function returns. Important note: the underlying vector is an implementation detail. Even though this function exposes it, changes in the implementation may cause this function to be removed without further warning." ;; KLUDGE: Without TRULY-THE the system is not smart enough to figure out that - ;; (1) SIMPLE-ARRAY without ARRAY-HEADER-P is a vector (2) the data vector of - ;; a SIMPLE-ARRAY is a vector. + ;; the return value is always of the known type. (truly-the (simple-array * (*)) (if (array-header-p array) - (%array-data-vector array) + (if (%array-displaced-p array) + (error "~S cannot be used with displaced arrays. Use ~S instead." + 'array-storage-vector 'array-displacement) + (%array-data-vector array)) array))) ;;;; used by SORT