;;; FIXME: see also DEFCONSTANT MAXIMUM-BIGNUM-LENGTH in
;;; src/code/bignum.lisp. -- CSR, 2004-07-19
(sb!xc:deftype bignum-index ()
- '(integer 0 #.(1- (ash 1 (- 32 sb!vm:n-widetag-bits)))))
+ '(integer 0 #.(1- (ash 1 (- sb!vm:n-word-bits sb!vm:n-widetag-bits)))))
\f
;;;; hooks into the type system
;; assuming that the upgraded-element-type should be
;; equal to T, given the way that the AREF
;; DERIVE-TYPE optimizer works. -- CSR, 2002-08-19
- (unknown-type-p eltype))
+ (contains-unknown-type-p eltype))
*wild-type*
(dolist (stype-name *specialized-array-element-types*
*universal-type*)
"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))))))
+ (handler-case
+ ;; Can't rely on SPECIFIER-TYPE to signal PARSE-UNKNOWN-TYPE in
+ ;; the case of (AND KNOWN UNKNOWN), since the result of the
+ ;; outter call to SPECIFIER-TYPE can be cached by the code that
+ ;; doesn't catch PARSE-UNKNOWN-TYPE signal.
+ (if (contains-unknown-type-p (specifier-type spec))
+ (error "Undefined type: ~S" spec)
+ (type-specifier (array-type-specialized-element-type
+ (specifier-type `(array ,spec)))))
+ (parse-unknown-type (c)
+ (error "Undefined type: ~S" (parse-unknown-type-specifier c)))))
(defun sb!xc:upgraded-complex-part-type (spec &optional environment)
#!+sb-doc
;;; If TYPE has a CHECK-xxx template, but doesn't have a corresponding
;;; PRIMITIVE-TYPE, then return the template's name. Otherwise, return NIL.
-;;; The second value is T if the template needs TYPE to be passed.
(defun hairy-type-check-template-name (type)
(declare (type ctype type))
(typecase type
#!+#.(cl:if (cl:= 64 sb!vm:n-word-bits) '(and) '(or))
((type= type (specifier-type '(unsigned-byte 64)))
'sb!c:check-unsigned-byte-64)
- #!+(or x86 x86-64) ; Not implemented yet on other platforms
- ((and (eql (numeric-type-class type) 'integer)
- (eql (numeric-type-low type) 0)
- (fixnump (numeric-type-high type)))
- (values 'sb!c:check-mod-fixnum t))
(t nil)))
(fun-type
'sb!c:check-fun)