X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fcross-type.lisp;h=0ac13c9d52e46e120b36f20372daca42a1c0d46c;hb=3ca73f72116001579bde0f59e5aa1359cc41631e;hp=c68b2ce5c772942ede9b03e49ee271719e5f3920;hpb=4898ef32c639b1c7f4ee13a5ba566ce6debd03e6;p=sbcl.git diff --git a/src/code/cross-type.lisp b/src/code/cross-type.lisp index c68b2ce..0ac13c9 100644 --- a/src/code/cross-type.lisp +++ b/src/code/cross-type.lisp @@ -143,7 +143,6 @@ '(sb!alien:alien)) (member target-type '(system-area-pointer - funcallable-instance sb!alien-internals:alien-value))) (values nil t)) (;; special case when TARGET-TYPE isn't a type spec, but @@ -164,13 +163,13 @@ '(array simple-string simple-vector string vector)) (values (typep host-object target-type) t)) (;; general cases of vectors - (and (not (unknown-type-p (values-specifier-type target-type))) + (and (not (hairy-type-p (values-specifier-type target-type))) (sb!xc:subtypep target-type 'cl:vector)) (if (vectorp host-object) (warn-and-give-up) ; general-case vectors being way too hard (values nil t))) ; but "obviously not a vector" being easy (;; general cases of arrays - (and (not (unknown-type-p (values-specifier-type target-type))) + (and (not (hairy-type-p (values-specifier-type target-type))) (sb!xc:subtypep target-type 'cl:array)) (if (arrayp host-object) (warn-and-give-up) ; general-case arrays being way too hard @@ -208,7 +207,7 @@ (t (values nil t)))) (;; Complexes suffer the same kind of problems as arrays - (and (not (unknown-type-p (values-specifier-type target-type))) + (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 @@ -342,10 +341,23 @@ ;;; cross-compile time only. (defun ctypep (obj ctype) (check-type ctype ctype) - (let (;; the Common Lisp type specifier corresponding to CTYPE - (type (type-specifier ctype))) - (check-type type (or symbol cons)) - (cross-typep obj type))) + ;; There is at least one possible endless recursion in the + ;; cross-compiler type system: (SUBTYPEP NULL (OR UNKOWN0 UNKNOWN1) + ;; runs out of stack. The right way would probably be to not + ;; implement CTYPEP in terms of TYPE-SPECIFIER (:UNPARSE, that may + ;; call TYPE=, that in turn may call CTYPEP). Until then, pick a few + ;; cherries off. + (cond ((member-type-p ctype) + (if (member obj (member-type-members ctype)) + (values t t) + (values nil t))) + ((union-type-p ctype) + (any/type #'ctypep obj (union-type-types ctype))) + (t + (let ( ;; the Common Lisp type specifier corresponding to CTYPE + (type (type-specifier ctype))) + (check-type type (or symbol cons)) + (cross-typep obj type))))) (defun ctype-of (x) (typecase x