X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Ffndb.lisp;h=31f43505b429490133390177c9c7832d21b7eeb4;hb=2010727926b091b23a246f6f659be61e27e19667;hp=6614a446bcc7631938bb59020adc9c463c84c79c;hpb=b8fe7c0afeb9901091ce781ba351d0513f2ee86d;p=sbcl.git diff --git a/src/compiler/fndb.lisp b/src/compiler/fndb.lisp index 6614a44..31f4350 100644 --- a/src/compiler/fndb.lisp +++ b/src/compiler/fndb.lisp @@ -35,19 +35,17 @@ ;; FIXME: It's actually not clear that COERCE on non-NUMBER types ;; is FOLDABLE at all. Check this. (movable #-sb-xc-host foldable) - :derive-type (result-type-specifier-nth-arg 2)) -(defknown list-to-simple-string* (list) simple-string) -(defknown list-to-bit-vector* (list) bit-vector) + ;; :DERIVE-TYPE RESULT-TYPE-SPEC-NTH-ARG 2 ? Nope... (COERCE 1 'COMPLEX) + ;; returns REAL/INTEGER, not COMPLEX. + ) (defknown list-to-vector* (list type-specifier) vector) -(defknown list-to-simple-vector* (list) simple-vector) (defknown vector-to-vector* (vector type-specifier) vector) -(defknown vector-to-simple-string* (vector) vector) (defknown type-of (t) t (foldable flushable)) ;;; These can be affected by type definitions, so they're not FOLDABLE. (defknown (upgraded-complex-part-type upgraded-array-element-type) - (type-specifier) type-specifier + (type-specifier &optional lexenv-designator) type-specifier (unsafely-flushable)) ;;;; from the "Predicates" chapter: @@ -58,7 +56,7 @@ ;;; FIXNUMness) might be different between host and target. Perhaps ;;; this property should be protected by #-SB-XC-HOST? Perhaps we need ;;; 3-stage bootstrapping after all? (Ugh! It's *so* slow already!) -(defknown typep (t type-specifier) t +(defknown typep (t type-specifier &optional lexenv-designator) t ;; Unlike SUBTYPEP or UPGRADED-ARRAY-ELEMENT-TYPE and friends, this ;; seems to be FOLDABLE. Like SUBTYPEP, it's affected by type ;; definitions, but unlike SUBTYPEP, there should be no way to make @@ -77,7 +75,8 @@ ;; (UPGRADED-ARRAY-ELEMENT-TYPE and UPGRADED-COMPLEX-PART-TYPE have ;; behavior like SUBTYPEP in this respect, not like TYPEP.) (foldable)) -(defknown subtypep (type-specifier type-specifier) (values boolean boolean) +(defknown subtypep (type-specifier type-specifier &optional lexenv-designator) + (values boolean boolean) ;; This is not FOLDABLE because its value is affected by type ;; definitions. ;; @@ -98,7 +97,7 @@ (sb!xc:deftype name-for-class () t) (defknown class-name (sb!xc:class) name-for-class (flushable)) -(defknown find-class (name-for-class &optional t lexenv) +(defknown find-class (name-for-class &optional t lexenv-designator) (or sb!xc:class null) ()) (defknown class-of (t) sb!xc:class (flushable)) (defknown layout-of (t) layout (flushable)) @@ -125,13 +124,18 @@ (defknown fmakunbound ((or symbol cons)) (or symbol cons) (unsafe explicit-check)) (defknown (get-setf-method get-setf-method-multiple-value) - ((or list symbol) &optional lexenv) + ((or list symbol) &optional lexenv-designator) (values list list list form form) (flushable)) (defknown apply (callable t &rest t) *) ; ### Last arg must be List... (defknown funcall (callable &rest t) *) -(defknown (mapcar maplist mapcan mapcon) (callable list &rest list) list +(defknown (mapcar maplist) (callable list &rest list) list + (call)) + +;;; According to CLHS the result must be a LIST, but we do not check +;;; it. +(defknown (mapcan mapcon) (callable list &rest list) t (call)) (defknown (mapc mapl) (callable list &rest list) list (foldable call)) @@ -144,13 +148,13 @@ ;;;; from the "Macros" chapter: -(defknown macro-function (symbol &optional lexenv) +(defknown macro-function (symbol &optional lexenv-designator) (or function null) (flushable)) -(defknown (macroexpand macroexpand-1) (t &optional lexenv) +(defknown (macroexpand macroexpand-1) (t &optional lexenv-designator) (values form &optional boolean)) -(defknown compiler-macro-function (t &optional lexenv) +(defknown compiler-macro-function (t &optional lexenv-designator) (or function null) (flushable)) @@ -392,7 +396,7 @@ upper-case-p lower-case-p both-case-p alphanumericp) (character) boolean (movable foldable flushable)) -(defknown digit-char-p (character &optional unsigned-byte) +(defknown digit-char-p (character &optional (integer 2 36)) (or (integer 0 35) null) (movable foldable flushable)) (defknown (char= char/= char< char> char<= char>= char-equal char-not-equal @@ -403,7 +407,7 @@ (defknown char-code (character) char-code (movable foldable flushable)) (defknown (char-upcase char-downcase) (character) character (movable foldable flushable)) -(defknown digit-char (integer &optional integer) +(defknown digit-char (unsigned-byte &optional (integer 2 36)) (or character null) (movable foldable flushable)) (defknown char-int (character) char-code (movable foldable flushable)) (defknown char-name (character) (or simple-string null) @@ -429,12 +433,12 @@ :derive-type (sequence-result-nth-arg 1)) (defknown copy-seq (sequence) consed-sequence (flushable) - :derive-type #'result-type-first-arg) + :derive-type (sequence-result-nth-arg 1)) (defknown length (sequence) index (foldable flushable)) (defknown reverse (sequence) consed-sequence (flushable) - :derive-type #'result-type-first-arg) + :derive-type (sequence-result-nth-arg 1)) (defknown nreverse (sequence) sequence () :derive-type #'result-type-first-arg) @@ -499,7 +503,7 @@ (defknown remove (t sequence &key (:from-end t) (:test callable) (:test-not callable) (:start index) (:end sequence-end) - (:count sequence-end) (:key callable)) + (:count sequence-count) (:key callable)) consed-sequence (flushable call) :derive-type (sequence-result-nth-arg 2)) @@ -507,21 +511,21 @@ (defknown substitute (t t sequence &key (:from-end t) (:test callable) (:test-not callable) (:start index) (:end sequence-end) - (:count sequence-end) (:key callable)) + (:count sequence-count) (:key callable)) consed-sequence (flushable call) :derive-type (sequence-result-nth-arg 3)) (defknown (remove-if remove-if-not) (callable sequence &key (:from-end t) (:start index) (:end sequence-end) - (:count sequence-end) (:key callable)) + (:count sequence-count) (:key callable)) consed-sequence (flushable call) :derive-type (sequence-result-nth-arg 2)) (defknown (substitute-if substitute-if-not) (t callable sequence &key (:from-end t) (:start index) (:end sequence-end) - (:count sequence-end) (:key callable)) + (:count sequence-count) (:key callable)) consed-sequence (flushable call) :derive-type (sequence-result-nth-arg 3)) @@ -529,7 +533,7 @@ (defknown delete (t sequence &key (:from-end t) (:test callable) (:test-not callable) (:start index) (:end sequence-end) - (:count sequence-end) (:key callable)) + (:count sequence-count) (:key callable)) sequence (flushable call) :derive-type (sequence-result-nth-arg 2)) @@ -537,21 +541,21 @@ (defknown nsubstitute (t t sequence &key (:from-end t) (:test callable) (:test-not callable) (:start index) (:end sequence-end) - (:count sequence-end) (:key callable)) + (:count sequence-count) (:key callable)) sequence (flushable call) :derive-type (sequence-result-nth-arg 3)) (defknown (delete-if delete-if-not) (callable sequence &key (:from-end t) (:start index) (:end sequence-end) - (:count sequence-end) (:key callable)) + (:count sequence-count) (:key callable)) sequence (flushable call) :derive-type (sequence-result-nth-arg 2)) (defknown (nsubstitute-if nsubstitute-if-not) (t callable sequence &key (:from-end t) (:start index) (:end sequence-end) - (:count sequence-end) (:key callable)) + (:count sequence-count) (:key callable)) sequence (flushable call) :derive-type (sequence-result-nth-arg 3)) @@ -618,6 +622,8 @@ (defknown (stable-sort sort) (sequence callable &key (:key callable)) sequence (call) :derive-type (sequence-result-nth-arg 1)) +(defknown sb!impl::sort-vector (vector index index function (or function null)) vector + (call)) (defknown merge (type-specifier sequence sequence callable &key (:key callable)) @@ -647,6 +653,9 @@ t (foldable flushable)) +;; Correct argument type restrictions for these functions are +;; complicated, so we just declare them to accept LISTs and suppress +;; flushing is safe code. (defknown (caar cadr cdar cddr caaar caadr cadar caddr cdaar cdadr cddar cdddr caaaar caaadr caadar caaddr cadaar cadadr caddar cadddr @@ -671,14 +680,19 @@ (movable flushable unsafe)) ;;; All but last must be of type LIST, but there seems to be no way to -;;; express that in this syntax.. +;;; express that in this syntax. (defknown append (&rest t) t (flushable)) (defknown copy-list (list) list (flushable)) (defknown copy-alist (list) list (flushable)) (defknown copy-tree (t) t (flushable recursive)) (defknown revappend (list t) t (flushable)) -(defknown nconc (&rest list) list ()) + +;;; All but last must be of type LIST, but there seems to be no way to +;;; express that in this syntax. The result must be LIST, but we do +;;; not check it now :-). +(defknown nconc (&rest t) t ()) + (defknown nreconc (list t) list ()) (defknown butlast (list &optional index) list (flushable)) (defknown nbutlast (list &optional index) list ()) @@ -786,7 +800,7 @@ (defknown array-rank (array) array-rank (foldable flushable)) (defknown array-dimension (array array-rank) index (foldable flushable)) (defknown array-dimensions (array) list (foldable flushable)) -(defknown array-in-bounds-p (array &rest index) boolean (foldable flushable)) +(defknown array-in-bounds-p (array &rest integer) boolean (foldable flushable)) (defknown array-row-major-index (array &rest index) array-total-size (foldable flushable)) (defknown array-total-size (array) array-total-size (foldable flushable)) @@ -798,12 +812,12 @@ (defknown (bit-and bit-ior bit-xor bit-eqv bit-nand bit-nor bit-andc1 bit-andc2 bit-orc1 bit-orc2) - ((array bit) (array bit) &optional (or (array bit) (member t))) + ((array bit) (array bit) &optional (or (array bit) (member t nil))) (array bit) (foldable) #|:derive-type #'result-type-last-arg|#) -(defknown bit-not ((array bit) &optional (or (array bit) (member t))) +(defknown bit-not ((array bit) &optional (or (array bit) (member t nil))) (array bit) (foldable) #|:derive-type #'result-type-last-arg|#) @@ -817,7 +831,7 @@ (defknown adjust-array (array (or index list) &key (:element-type type-specifier) - (:initial-element t) (:initial-contents list) + (:initial-element t) (:initial-contents t) (:fill-pointer t) (:displaced-to (or array null)) (:displaced-index-offset index)) array (unsafe)) @@ -877,7 +891,7 @@ ;;;; from the "Eval" chapter: (defknown eval (t) * (recursive)) -(defknown constantp (t &optional lexenv) boolean +(defknown constantp (t &optional lexenv-designator) boolean (foldable flushable)) ;;;; from the "Streams" chapter: @@ -1047,7 +1061,8 @@ ()) (defknown logical-pathname (pathname-designator) logical-pathname ()) -(defknown translate-logical-pathname (pathname-designator &key) pathname ()) +(defknown translate-logical-pathname (pathname-designator &key) pathname + (recursive)) (defknown load-logical-pathname-translations (string) t ()) (defknown logical-pathname-translations (logical-host-designator) list ()) @@ -1299,8 +1314,8 @@ (defknown hairy-data-vector-ref (array index) t (foldable flushable explicit-check)) (defknown hairy-data-vector-set (array index t) t (unsafe explicit-check)) -(defknown sb!kernel:%caller-frame-and-pc () (values t t) (flushable)) -(defknown sb!kernel:%with-array-data (array index (or index null)) +(defknown %caller-frame-and-pc () (values t t) (flushable)) +(defknown %with-array-data (array index (or index null)) (values (simple-array * (*)) index index index) (foldable flushable)) (defknown %set-symbol-package (symbol t) t (unsafe)) @@ -1315,8 +1330,15 @@ (function sequence t index sequence-end function) (values t (or index null)) (call)) +(defknown effective-find-position-test (callable callable) + function + (flushable foldable)) +(defknown effective-find-position-key (callable) + function + (flushable foldable)) + -(defknown sb!kernel::arg-count-error (t t t t t t) nil (unsafe)) +(defknown arg-count-error (t t t t t t) nil (unsafe)) ;;;; SETF inverses @@ -1327,8 +1349,8 @@ (defknown %put (symbol t t) t (unsafe)) (defknown %setelt (sequence index t) t (unsafe)) (defknown %svset (simple-vector index t) t (unsafe)) -(defknown %bitset (bit-vector &rest index) bit (unsafe)) -(defknown %sbitset (simple-bit-vector &rest index) bit (unsafe)) +(defknown %bitset ((array bit) &rest index) bit (unsafe)) +(defknown %sbitset ((simple-array bit) &rest index) bit (unsafe)) (defknown %charset (string index character) character (unsafe)) (defknown %scharset (simple-string index character) character (unsafe)) (defknown %set-symbol-value (symbol t) t (unsafe)) @@ -1344,3 +1366,6 @@ (defknown %fun-name (function) t (flushable)) (defknown (setf %fun-name) (t function) t (unsafe)) + +(defknown policy-quality (policy symbol) policy-quality + (flushable))