;;; T unless it's certain) and the second value to tell whether it's
;;; certain.
(defun cross-typep (host-object raw-target-type)
- (let ((target-type (type-expand raw-target-type)))
+ (let ((target-type (typexpand raw-target-type)))
(flet ((warn-and-give-up ()
;; We don't have to keep track of this as long as system
;; performance is acceptable, since giving up
(values (typep host-object target-type) t))
(t
(values nil t))))
- (;; Complexes suffer the same kind of problems as arrays
+ (;; Complexes suffer the same kind of problems as arrays.
+ ;; Our dumping logic is based on contents, however, so
+ ;; reasoning about them should be safe
(and (not (hairy-type-p (values-specifier-type target-type)))
(sb!xc:subtypep target-type 'cl:complex))
(if (complexp host-object)
- (warn-and-give-up) ; general-case complexes being way too hard
- (values nil t))) ; but "obviously not a complex" being easy
+ (let ((re (realpart host-object))
+ (im (imagpart host-object)))
+ (if (or (and (eq target-type 'complex)
+ (typep re 'rational) (typep im 'rational))
+ (and (equal target-type '(cl:complex single-float))
+ (typep re 'single-float) (typep im 'single-float))
+ (and (equal target-type '(cl:complex double-float))
+ (typep re 'double-float) (typep im 'double-float)))
+ (values t t)
+ (progn
+ ;; We won't know how to dump it either.
+ (warn "Host complex too complex: ~S" host-object)
+ (warn-and-give-up))))
+ (values nil t)))
;; Some types require translation between the cross-compilation
;; host Common Lisp and the target SBCL.
((target-type-is-in '(classoid))
(if (stringp host-object)
(warn-and-give-up)
(values nil t)))
- ((target-type-is-in '(character base-char))
+ ((target-type-is-in '(character base-char standard-char))
(cond ((typep host-object 'standard-char)
(values t t))
((not (characterp host-object))
;; trivial.
(and (every/type #'cross-typep host-object rest))
(or (any/type #'cross-typep host-object rest))
+ (not
+ (multiple-value-bind (value surep)
+ (cross-typep host-object (car rest))
+ (if surep
+ (values (not value) t)
+ (warn-and-give-up))))
;; If we want to work with the KEYWORD type, we need
;; to grok (SATISFIES KEYWORDP).
(satisfies