X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fgeneric%2Fvm-type.lisp;h=85c1b0b8af7b94b031a66ae7429c36e13e5bb4e3;hb=079ef9dad558ca07cb8178ef428bf738112174fa;hp=a900222c2a43962ea064936c236e34b12e6e33f7;hpb=7646aefa188758e2892fea2ad02be4f29b3938f2;p=sbcl.git diff --git a/src/compiler/generic/vm-type.lisp b/src/compiler/generic/vm-type.lisp index a900222..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 @@ -137,6 +140,30 @@ (type-specifier (array-type-specialized-element-type (specifier-type `(array ,spec)))))) +(defun sb!xc:upgraded-complex-part-type (spec &optional environment) + #!+sb-doc + "Return the element type of the most specialized COMPLEX number type that + can hold parts of type SPEC." + (declare (ignore environment)) + (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. (defun containing-integer-type (subtype)