X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcode%2Flate-type.lisp;h=70ccba2a7d02067c34f2894bd3d1e071ba5c0578;hb=6c4d4d984b1af6b2a73568cec3ab9c8795cff2da;hp=171ad657a84ef99fe2021e3a6d986757f7ea844e;hpb=ebbaa0e11a4d5c9bf021d28f212cfb6d5cd4aaab;p=sbcl.git diff --git a/src/code/late-type.lisp b/src/code/late-type.lisp index 171ad65..70ccba2 100644 --- a/src/code/late-type.lisp +++ b/src/code/late-type.lisp @@ -69,7 +69,7 @@ ;; If TYPE2 might be concealing something related to our class ;; hierarchy (if (type-might-contain-other-types-p type2) - ;; too confusing, gotta punt + ;; too confusing, gotta punt (values nil nil) ;; ordinary case expected by old CMU CL code, where the taxonomy ;; of TYPE2's representation accurately reflects the taxonomy of @@ -216,8 +216,45 @@ ;;; Since all function types are equivalent to FUNCTION, they are all ;;; subtypes of each other. (!define-type-method (function :simple-subtypep) (type1 type2) - (declare (ignore type1 type2)) - (values t t)) + (flet ((fun-type-simple-p (type) + (not (or (fun-type-rest type) + (fun-type-keyp type)))) + (every-csubtypep (types1 types2) + (loop + for a1 in types1 + for a2 in types2 + do (multiple-value-bind (res sure-p) + (csubtypep a1 a2) + (unless res (return (values res sure-p)))) + finally (return (values t t))))) + (macrolet ((3and (x y) + `(multiple-value-bind (val1 win1) + ,x + (if (and (not val1) win1) + (values nil t) + (multiple-value-bind (val2 win2) + ,y + (if (and val1 val2) + (values t t) + (values nil (or win1 win2)))))))) + (3and (csubtypep (fun-type-returns type1) + (fun-type-returns type2)) + (cond ((fun-type-wild-args type2) + (values t t)) + ((fun-type-wild-args type1) + (values nil t)) + ((not (or (fun-type-simple-p type1) + (fun-type-simple-p type2))) + (values nil nil)) + ((not (and (= (length (fun-type-required type1)) + (length (fun-type-required type2))) + (= (length (fun-type-optional type1)) + (length (fun-type-optional type2))))) + (values nil t)) + (t (3and (every-csubtypep (fun-type-required type1) + (fun-type-required type2)) + (every-csubtypep (fun-type-optional type1) + (fun-type-optional type2))))))))) (!define-superclasses function ((function)) !cold-init-forms)