X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Farray.lisp;h=d8d04e90ddf3d3eb5c491034d120bcec596667ee;hb=2768ed83de59354b21ea61de3dea358c53d1ae05;hp=68aa0c6df08c29abaf0b4472fd66e360dd09e21d;hpb=f578dd10fa6d9a8d7c3d15d3100406976f6a273c;p=sbcl.git diff --git a/src/code/array.lisp b/src/code/array.lisp index 68aa0c6..d8d04e9 100644 --- a/src/code/array.lisp +++ b/src/code/array.lisp @@ -51,7 +51,9 @@ (defun %data-vector-and-index (array index) (if (array-header-p array) - (%with-array-data array index nil) + (multiple-value-bind (vector index) + (%with-array-data array index nil) + (values vector index)) (values array index))) ;;; It'd waste space to expand copies of error handling in every @@ -63,15 +65,6 @@ (bug "called FAILED-%WITH-ARRAY-DATA with valid array parameters?")) ;;;; MAKE-ARRAY -(defun upgraded-array-element-type (spec &optional environment) - #!+sb-doc - "Return the element type that will actually be used to implement an array - with the specifier :ELEMENT-TYPE Spec." - (declare (ignore environment)) - (if (unknown-type-p (specifier-type spec)) - (error "undefined type: ~S" spec) - (type-specifier (array-type-specialized-element-type - (specifier-type `(array ,spec)))))) (eval-when (:compile-toplevel :execute) (sb!xc:defmacro pick-vector-type (type &rest specs) `(cond ,@(mapcar (lambda (spec) @@ -107,6 +100,7 @@ ;; FIXME: The data here are redundant with ;; *SPECIALIZED-ARRAY-ELEMENT-TYPE-PROPERTIES*. (pick-vector-type type + (nil (values #.sb!vm:simple-array-nil-widetag 0)) (base-char (values #.sb!vm:simple-string-widetag #.sb!vm:n-byte-bits)) (bit (values #.sb!vm:simple-bit-vector-widetag 1)) ((unsigned-byte 2) @@ -173,11 +167,11 @@ (when (and displaced-index-offset (null displaced-to)) (error "can't specify :DISPLACED-INDEX-OFFSET without :DISPLACED-TO")) (if (and simple (= array-rank 1)) - ;; Its a (simple-array * (*)) + ;; it's a (SIMPLE-ARRAY * (*)) (multiple-value-bind (type n-bits) (%vector-widetag-and-n-bits element-type) (declare (type (unsigned-byte 8) type) - (type (integer 1 256) n-bits)) + (type (integer 0 256) n-bits)) (let* ((length (car dimensions)) (array (allocate-vector type @@ -201,7 +195,7 @@ length)) (replace array initial-contents)) array)) - ;; It's either a complex array or a multidimensional array. + ;; it's either a complex array or a multidimensional array. (let* ((total-size (reduce #'* dimensions)) (data (or displaced-to (data-vector-from-inits @@ -252,7 +246,7 @@ (setf (%array-dimension array axis) dim) (incf axis))) array)))) - + ;;; DATA-VECTOR-FROM-INITS returns a simple vector that has the ;;; specified array characteristics. Dimensions is only used to pass ;;; to FILL-DATA-VECTOR for error checking on the structure of @@ -328,7 +322,8 @@ #!+long-float long-float (complex single-float) (complex double-float) - #!+long-float (complex long-float)))) + #!+long-float (complex long-float) + nil))) (defun hairy-data-vector-ref (array index) (with-array-data ((vector array) (index index) (end)) @@ -384,7 +379,7 @@ (let ((index (car subs)) (dim (%array-dimension array axis))) (declare (fixnum dim)) - (unless (< -1 index 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" @@ -396,7 +391,7 @@ (setf chunk-size (* chunk-size dim)))) (let ((index (first subscripts)) (length (length (the (simple-array * (*)) array)))) - (unless (< -1 index length) + (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 @@ -411,7 +406,7 @@ (defun array-in-bounds-p (array &rest subscripts) #!+sb-doc - "Return T if the Subscipts are in bounds for the Array, Nil otherwise." + "Return T if the SUBSCIPTS are in bounds for the ARRAY, NIL otherwise." (if (%array-row-major-index array subscripts nil) t)) @@ -420,7 +415,7 @@ (defun aref (array &rest subscripts) #!+sb-doc - "Return the element of the Array specified by the Subscripts." + "Return the element of the ARRAY specified by the SUBSCRIPTS." (row-major-aref array (%array-row-major-index array subscripts))) (defun %aset (array &rest stuff) @@ -552,6 +547,7 @@ ;; FIXME: The data here are redundant with ;; *SPECIALIZED-ARRAY-ELEMENT-TYPE-PROPERTIES*. (pick-element-type + (sb!vm:simple-array-nil-widetag nil) ((sb!vm:simple-string-widetag sb!vm:complex-string-widetag) 'base-char) ((sb!vm:simple-bit-vector-widetag sb!vm:complex-bit-vector-widetag) 'bit) @@ -870,6 +866,8 @@ (unless (array-header-p vector) (macrolet ((frob (name &rest things) `(etypecase ,name + ((simple-array nil (*)) (error 'cell-error + :name 'nil-array-element)) ,@(mapcar (lambda (thing) (destructuring-bind (type-spec fill-value) thing