X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fpred.lisp;h=bb71bac0f53872e2c5649660d1c45bedc81f7101;hb=245101f127d61e28b9c864c720eb17973469a904;hp=400c42b0bb0f4d3e91e23c6075b95aa031a957db;hpb=8fb02633217a721b85487531709779f338d02438;p=sbcl.git diff --git a/src/code/pred.lisp b/src/code/pred.lisp index 400c42b..bb71bac 100644 --- a/src/code/pred.lisp +++ b/src/code/pred.lisp @@ -113,19 +113,35 @@ (defun type-of (object) #!+sb-doc "Return the type of OBJECT." - (if (typep object '(or function array complex)) - (type-specifier (ctype-of object)) - (let* ((class (layout-class (layout-of object))) - (name (class-name class))) - (if (typep object 'instance) - (case name - (sb!alien-internals:alien-value - `(sb!alien:alien - ,(sb!alien-internals:unparse-alien-type - (sb!alien-internals:alien-value-type object)))) - (t - (class-proper-name class))) - name)))) + (typecase object + (fixnum + (cond + ((<= 0 object 1) 'bit) + ((< object 0) 'fixnum) + (t '(integer 0 #.sb!xc:most-positive-fixnum)))) + (integer + (if (>= object 0) + '(integer #.(1+ sb!xc:most-positive-fixnum)) + 'bignum)) + (standard-char 'standard-char) + ((member t) 'boolean) + (keyword 'keyword) + ((or array complex) (type-specifier (ctype-of object))) + (t + (let* ((classoid (layout-classoid (layout-of object))) + (name (classoid-name classoid))) + (if (typep object 'instance) + (case name + (sb!alien-internals:alien-value + `(sb!alien:alien + ,(sb!alien-internals:unparse-alien-type + (sb!alien-internals:alien-value-type object)))) + (t + (let ((pname (classoid-proper-name classoid))) + (if (classoid-p pname) + (classoid-pcl-class pname) + pname)))) + name))))) ;;;; equality predicates @@ -209,7 +225,7 @@ (len (layout-length layout-x))) (and (typep y 'instance) (eq layout-x (%instance-layout y)) - (structure-class-p (layout-class layout-x)) + (structure-classoid-p (layout-classoid layout-x)) (do ((i 1 (1+ i))) ((= i len) t) (declare (fixnum i)) @@ -245,7 +261,7 @@ (/show0 "about to do test cases in pred.lisp") #!+sb-test -(let ((test-cases '((0.0 -0.0 t) +(let ((test-cases `((0.0 ,(load-time-value (make-unportable-float :single-float-negative-zero)) t) (0.0 1.0 nil) (#c(1 0) #c(1.0 0) t) (#c(1.1 0) #c(11/10 0) nil) ; due to roundoff error