X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fgeneric%2Fvm-type.lisp;h=85c1b0b8af7b94b031a66ae7429c36e13e5bb4e3;hb=079ef9dad558ca07cb8178ef428bf738112174fa;hp=e43b2d44c183b84d5e0937fbc38bc130ad44617c;hpb=25c9bfeaaf0597e37271dde31eed7037dba391e0;p=sbcl.git diff --git a/src/compiler/generic/vm-type.lisp b/src/compiler/generic/vm-type.lisp index e43b2d4..85c1b0b 100644 --- a/src/compiler/generic/vm-type.lisp +++ b/src/compiler/generic/vm-type.lisp @@ -16,7 +16,7 @@ ;;;; FIXME: I'm not sure where to put this. -- WHN 19990817 -(deftype sb!vm:word () `(unsigned-byte ,sb!vm:n-word-bits)) +(def!type sb!vm:word () `(unsigned-byte ,sb!vm:n-word-bits)) ;;;; implementation-dependent DEFTYPEs @@ -73,7 +73,10 @@ (sb!xc:deftype bignum-element-type () `(unsigned-byte ,sb!vm:n-word-bits)) (sb!xc:deftype bignum-type () 'bignum) -(sb!xc:deftype bignum-index () 'index) +;;; 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))))) ;;;; hooks into the type system @@ -142,21 +145,24 @@ "Return the element type of the most specialized COMPLEX number type that can hold parts of type SPEC." (declare (ignore environment)) - (if (unknown-type-p (specifier-type spec)) - (error "undefined type: ~S" spec) - (let ((ctype (specifier-type `(complex ,spec)))) - (cond - ((eq ctype *empty-type*) '(eql 0)) - ((csubtypep ctype (specifier-type '(complex single-float))) - 'single-float) - ((csubtypep ctype (specifier-type '(complex double-float))) - 'double-float) - #!+long-float - ((csubtypep ctype (specifier-type '(complex long-float))) - 'long-float) - ((csubtypep ctype (specifier-type '(complex rational))) - 'rational) - (t 'real))))) + (let ((type (specifier-type spec))) + (cond + ((eq type *empty-type*) nil) + ((unknown-type-p type) (error "undefined type: ~S" spec)) + (t + (let ((ctype (specifier-type `(complex ,spec)))) + (cond + ((eq ctype *empty-type*) '(eql 0)) + ((csubtypep ctype (specifier-type '(complex single-float))) + 'single-float) + ((csubtypep ctype (specifier-type '(complex double-float))) + 'double-float) + #!+long-float + ((csubtypep ctype (specifier-type '(complex long-float))) + 'long-float) + ((csubtypep ctype (specifier-type '(complex rational))) + 'rational) + (t 'real))))))) ;;; Return the most specific integer type that can be quickly checked that ;;; includes the given type.