X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Farray.lisp;h=8adb473b45fc82c642bb2aa22b6db214750fc9f7;hb=74a48d09e08aead6f67204878bdf9be4f448e1e8;hp=62452a5f993081d2111fe5b26bf95549f5e3de8a;hpb=3c65762b927af861c9c8bc416e4cbac9a14ec0c3;p=sbcl.git diff --git a/src/code/array.lisp b/src/code/array.lisp index 62452a5..8adb473 100644 --- a/src/code/array.lisp +++ b/src/code/array.lisp @@ -61,11 +61,11 @@ (eval-when (:compile-toplevel :execute) (sb!xc:defmacro pick-vector-type (type &rest specs) - `(cond ,@(mapcar #'(lambda (spec) - `(,(if (eq (car spec) t) + `(cond ,@(mapcar (lambda (spec) + `(,(if (eq (car spec) t) t `(subtypep ,type ',(car spec))) - ,@(cdr spec))) + ,@(cdr spec))) specs)))) ;;; These functions are used in the implementation of MAKE-ARRAY for @@ -75,7 +75,7 @@ ;;; MAKE-ARRAY for any non-simple array. Thus, there's some value to ;;; making this somewhat efficient, at least not doing full calls to ;;; SUBTYPEP in the easy cases. -(defun %vector-type-code (type) +(defun %vector-widetag-and-n-bits (type) (case type ;; Pick off some easy common cases. ;; @@ -84,9 +84,9 @@ ;; on smarter compiler transforms which do the calculation once ;; and for all in any reasonable user programs.) ((t) - (values #.sb!vm:simple-vector-widetag #.sb!vm:word-bits)) + (values #.sb!vm:simple-vector-widetag #.sb!vm:n-word-bits)) ((character base-char standard-char) - (values #.sb!vm:simple-string-widetag #.sb!vm:byte-bits)) + (values #.sb!vm:simple-string-widetag #.sb!vm:n-byte-bits)) ((bit) (values #.sb!vm:simple-bit-vector-widetag 1)) ;; OK, we have to wade into SUBTYPEPing after all. @@ -94,7 +94,7 @@ ;; FIXME: The data here are redundant with ;; *SPECIALIZED-ARRAY-ELEMENT-TYPE-PROPERTIES*. (pick-vector-type type - (base-char (values #.sb!vm:simple-string-widetag #.sb!vm:byte-bits)) + (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) (values #.sb!vm:simple-array-unsigned-byte-2-widetag 2)) @@ -129,8 +129,8 @@ (values #.sb!vm:simple-array-complex-long-float-widetag #!+x86 192 #!+sparc 256)) - (t (values #.sb!vm:simple-vector-widetag #.sb!vm:word-bits)))))) -(defun %complex-vector-type-code (type) + (t (values #.sb!vm:simple-vector-widetag #.sb!vm:n-word-bits)))))) +(defun %complex-vector-widetag (type) (case type ;; Pick off some easy common cases. ((t) @@ -161,9 +161,10 @@ (error "can't specify :DISPLACED-INDEX-OFFSET without :DISPLACED-TO")) (if (and simple (= array-rank 1)) ;; Its a (simple-array * (*)) - (multiple-value-bind (type bits) (%vector-type-code element-type) + (multiple-value-bind (type n-bits) + (%vector-widetag-and-n-bits element-type) (declare (type (unsigned-byte 8) type) - (type (integer 1 256) bits)) + (type (integer 1 256) n-bits)) (let* ((length (car dimensions)) (array (allocate-vector type @@ -171,8 +172,8 @@ (ceiling (* (if (= type sb!vm:simple-string-widetag) (1+ length) length) - bits) - sb!vm:word-bits)))) + n-bits) + sb!vm:n-word-bits)))) (declare (type index length)) (when initial-element-p (fill array initial-element)) @@ -181,8 +182,8 @@ (error "can't specify both :INITIAL-ELEMENT and ~ :INITIAL-CONTENTS")) (unless (= length (length initial-contents)) - (error "There are ~D elements in the :INITIAL-CONTENTS, but ~ - the vector length is ~D." + (error "There are ~W elements in the :INITIAL-CONTENTS, but ~ + the vector length is ~W." (length initial-contents) length)) (replace array initial-contents)) @@ -195,7 +196,7 @@ initial-contents initial-element initial-element-p))) (array (make-array-header (cond ((= array-rank 1) - (%complex-vector-type-code element-type)) + (%complex-vector-widetag element-type)) (simple sb!vm:simple-array-widetag) (t sb!vm:complex-array-widetag)) array-rank))) @@ -211,8 +212,9 @@ (unless (and (fixnump fill-pointer) (>= fill-pointer 0) (<= fill-pointer length)) - (error "invalid fill-pointer ~D" - fill-pointer)) + ;; FIXME: should be TYPE-ERROR? + (error "invalid fill-pointer ~W" + fill-pointer)) fill-pointer)))) (setf (%array-fill-pointer-p array) t)) (t @@ -273,12 +275,12 @@ (t (unless (typep contents 'sequence) (error "malformed :INITIAL-CONTENTS: ~S is not a ~ - sequence, but ~D more layer~:P needed." + sequence, but ~W more layer~:P needed." contents (- (length dimensions) axis))) (unless (= (length contents) (car dims)) (error "malformed :INITIAL-CONTENTS: Dimension of ~ - axis ~D is ~D, but ~S is ~D long." + axis ~W is ~W, but ~S is ~W long." axis (car dims) contents (length contents))) (if (listp contents) (dolist (content contents) @@ -345,7 +347,7 @@ (list subscripts)) (let ((rank (array-rank array))) (unless (= rank (length subscripts)) - (error "wrong number of subscripts, ~D, for array of rank ~D" + (error "wrong number of subscripts, ~W, for array of rank ~W" (length subscripts) rank)) (if (array-header-p array) (do ((subs (nreverse subscripts) (cdr subs)) @@ -359,7 +361,7 @@ (declare (fixnum index dim)) (unless (< -1 index dim) (if invalid-index-error-p - (error "invalid index ~D~[~;~:; on axis ~:*~D~] in ~S" + (error "invalid index ~W~[~;~:; on axis ~:*~W~] in ~S" index axis array) (return-from %array-row-major-index nil))) (incf result (* chunk-size index)) @@ -367,7 +369,7 @@ (let ((index (first subscripts))) (unless (< -1 index (length (the (simple-array * (*)) array))) (if invalid-index-error-p - (error "invalid index ~D in ~S" index array) + (error "invalid index ~W in ~S" index array) (return-from %array-row-major-index nil))) index)))) @@ -488,22 +490,22 @@ (defun array-element-type (array) #!+sb-doc "Return the type of the elements of the array" - (let ((type (get-type array))) + (let ((widetag (widetag-of array))) (macrolet ((pick-element-type (&rest stuff) - `(cond ,@(mapcar #'(lambda (stuff) - (cons - (let ((item (car stuff))) - (cond ((eq item t) - t) - ((listp item) - (cons 'or - (mapcar #'(lambda (x) - `(= type ,x)) - item))) - (t - `(= type ,item)))) - (cdr stuff))) - stuff)))) + `(cond ,@(mapcar (lambda (stuff) + (cons + (let ((item (car stuff))) + (cond ((eq item t) + t) + ((listp item) + (cons 'or + (mapcar (lambda (x) + `(= widetag ,x)) + item))) + (t + `(= widetag ,item)))) + (cdr stuff))) + stuff)))) ;; FIXME: The data here are redundant with ;; *SPECIALIZED-ARRAY-ELEMENT-TYPE-PROPERTIES*. (pick-element-type @@ -555,7 +557,7 @@ (error "Vector axis is not zero: ~S" axis-number)) (length (the (simple-array * (*)) array))) ((>= axis-number (%array-rank array)) - (error "~D is too big; ~S only has ~D dimension~:P." + (error "Axis number ~W is too big; ~S only has ~D dimension~:P." axis-number array (%array-rank array))) (t (%array-dimension array axis-number)))) @@ -928,9 +930,9 @@ (defun zap-array-data-aux (old-data old-dims offset new-data new-dims) (declare (fixnum offset)) - (let ((limits (mapcar #'(lambda (x y) - (declare (fixnum x y)) - (1- (the fixnum (min x y)))) + (let ((limits (mapcar (lambda (x y) + (declare (fixnum x y)) + (1- (the fixnum (min x y)))) old-dims new-dims))) (macrolet ((bump-index-list (index limits) `(do ((subscripts ,index (cdr subscripts))