X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fearly-type.lisp;h=0af428157eacbfe6d067541c25d03492e2381b45;hb=a74b0bdb483504f6faddf8089f848f61ed94b92a;hp=5e21ecffc9df17f44218c50d80f06c0b5428eaf4;hpb=63cef087068afc157283c0a05ae1f16b962303aa;p=sbcl.git diff --git a/src/code/early-type.lisp b/src/code/early-type.lisp index 5e21ecf..0af4281 100644 --- a/src/code/early-type.lisp +++ b/src/code/early-type.lisp @@ -23,10 +23,11 @@ ;;; the original type spec. (defstruct (hairy-type (:include ctype (class-info (type-class-or-lose 'hairy)) - (enumerable t)) + (enumerable t) + (might-contain-other-types-p t)) (:copier nil) #!+cmu (:pure nil)) - ;; the Common Lisp type-specifier + ;; the Common Lisp type-specifier of the type we represent (specifier nil :type t)) (!define-type-class hairy) @@ -57,7 +58,9 @@ (defstruct (values-type (:include args-type (class-info (type-class-or-lose 'values))) + (:constructor %make-values-type) (:copier nil))) +(define-cached-synonym make-values-type) (!define-type-class values) @@ -206,6 +209,7 @@ ;;; things such as SIMPLE-STRING. (defstruct (array-type (:include ctype (class-info (type-class-or-lose 'array))) + (:constructor %make-array-type) (:copier nil)) ;; the dimensions of the array, or * if unspecified. If a dimension ;; is unspecified, it is *. @@ -216,6 +220,7 @@ (element-type (missing-arg) :type ctype) ;; the element type as it is specialized in this implementation (specialized-element-type *wild-type* :type ctype)) +(define-cached-synonym make-array-type) ;;; A MEMBER-TYPE represent a use of the MEMBER type specifier. We ;;; bother with this at this level because MEMBER types are fairly @@ -230,7 +235,8 @@ ;;; A COMPOUND-TYPE is a type defined out of a set of types, the ;;; common parent of UNION-TYPE and INTERSECTION-TYPE. -(defstruct (compound-type (:include ctype) +(defstruct (compound-type (:include ctype + (might-contain-other-types-p t)) (:constructor nil) (:copier nil)) (types nil :type list :read-only t)) @@ -246,6 +252,7 @@ (class-info (type-class-or-lose 'union))) (:constructor %make-union-type (enumerable types)) (:copier nil))) +(define-cached-synonym make-union-type) ;;; An INTERSECTION-TYPE represents a use of the AND type specifier ;;; which we couldn't canonicalize to something simpler. Canonical form: @@ -307,7 +314,7 @@ (logand (sxhash x) #x3FF)) :hash-bits 10 :init-wrapper !cold-init-forms) - ((orig eq)) + ((orig equal)) (let ((u (uncross orig))) (or (info :type :builtin u) (let ((spec (type-expand u))) @@ -357,6 +364,12 @@ (error "VALUES type illegal in this context:~% ~S" x)) res)) +(defun single-value-specifier-type (x) + (let ((res (specifier-type x))) + (if (eq res *wild-type*) + *universal-type* + res))) + ;;; Similar to MACROEXPAND, but expands DEFTYPEs. We don't bother ;;; returning a second value. (defun type-expand (form)