X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Farray.lisp;h=266c7374f99f10286c56c0bdde1ebf8b43c4be24;hb=bf77540f53dbb693d87b9ff4fbfd09d3de7fb2d9;hp=34de4635071e90a30b03c93640e754e62b47b958;hpb=138316f3ffc98856be1f63ad29f8b28b7e89547f;p=sbcl.git diff --git a/src/code/array.lisp b/src/code/array.lisp index 34de463..266c737 100644 --- a/src/code/array.lisp +++ b/src/code/array.lisp @@ -776,7 +776,7 @@ of specialized arrays is supported." :datum arg :expected-type (list 'integer 0 max) :format-control "The new fill pointer, ~S, is larger than the length of the vector (~S.)" - arg max))) + :format-arguments (list arg max)))) (t (error 'simple-type-error :datum vector @@ -1083,6 +1083,30 @@ of specialized arrays is supported." (setf (%array-dimension array 0) dimensions)) (setf (%array-displaced-p array) displacedp) array) + +;;; User visible extension +(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. + +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 + ;; the return value is always of the known type. + (truly-the (simple-array * (*)) + (if (array-header-p 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