DDeepin Developerfeat: Init commit
430163a1创建于 2022年10月19日历史提交
(with-test (:name (compile eval the type-error))
  (checked-compile-and-assert (:optimize :safe)
      '(lambda (v)
        (list (the fixnum (the (real 0) (eval v)))))
    ((0.1) (condition 'type-error))
    ((-1)  (condition 'type-error))))

(defun pick-acceptable-default (specifier)
  (let ((parse (sb-kernel:specifier-type specifier)))
    ; (format t "~&testcase: ~s~%" specifier)
    (typecase parse
      (sb-kernel:character-set-type #\a)
      (sb-kernel:numeric-type
       (cond ((eq (sb-kernel:numeric-type-class parse) 'float)
              (ecase (sb-kernel:numeric-type-complexp parse)
                (:real
                 (ecase (sb-kernel:numeric-type-format parse)
                   (single-float 1009f0)
                   (double-float pi)))
                (:complex
                 (ecase (sb-kernel:numeric-type-format parse)
                   (single-float #c(101f0 -1f0))
                   (double-float #c(2d0 3.5d0))))))
             (t
              1)))
      (t
       (cond ((equal specifier '(or (eql 1.0d0) (eql 10.0d0))) ; KLUDGE
              1.0d0)
             ((equal specifier '(member 1 2 10))
              2)
             ((equal specifier '(complex (member 10.0 20.0)))
              (complex 10.0 10.0))
             (t
              'whatever))))))

(with-test (:name :array-type-predicates)
  (dolist (et (list* '(integer -1 200) '(integer -256 1)
                     '(integer 0 128)
                     '(integer 0 (128))
                     '(double-float 0d0 (1d0))
                     '(single-float (0s0) (1s0))
                     '(or (eql 1d0) (eql 10d0))
                     '(member 1 2 10)
                     '(complex (member 10 20))
                     '(complex (member 10d0 20d0))
                     '(complex (member 10s0 20s0))
                     '(or integer double-float)
                     '(mod 1)
                     '(member #\a #\b)
                     '(eql #\a)
                     #+sb-unicode 'extended-char
                     #+sb-unicode '(eql #\cyrillic_small_letter_yu)
                     (map 'list 'sb-vm:saetp-specifier
                          sb-vm:*specialized-array-element-type-properties*)))
    (when et
      (let* ((v (make-array 3 :element-type et
                            ;; Pick an initial element because of the (ELT ,v 0)
                              :initial-element (pick-acceptable-default et))))
        (checked-compile-and-assert ()
            `(lambda ()
               (list (if (typep ,v '(simple-array ,et (*)))
                         :good
                         ',et)
                     (if (typep (elt ,v 0) '(simple-array ,et (*)))
                         ',et
                         :good)))
          (() '(:good :good)))))))

(with-test (:name (compile equal equalp :transforms))
  (let* ((s "foo")
         (bit-vector #*11001100)
         (values `(nil 1 2 "test"
                       ;; Floats duplicated here to ensure we get newly created instances
                       (read-from-string "1.1") (read-from-string "1.2d0")
                       (read-from-string "1.1") (read-from-string "1.2d0")
                       1.1 1.2d0 '("foo" "bar" "test")
                       #(1 2 3 4) #*101010 (make-broadcast-stream) #p"/tmp/file"
                       ,s (copy-seq ,s) ,bit-vector (copy-seq ,bit-vector)
                       ,(make-hash-table) #\a #\b #\A #\C
                       ,(make-random-state) 1/2 2/3)))

    (dolist (predicate '(equal equalp))
      ;; Test all permutations of different types
      (loop for x in values
         do (loop for y in values
               do (checked-compile-and-assert (:optimize nil)
                      `(lambda (x y)
                         (,predicate (the ,(type-of x) x)
                                     (the ,(type-of y) y)))
                    ((x y) (funcall predicate x y)))))
      (checked-compile-and-assert ()
          `(lambda (x y)
             (,predicate (the (cons (or simple-bit-vector simple-base-string))
                              x)
                         (the (cons (or (and bit-vector (not simple-array))
                                        (simple-array character (*))))
                              y)))
        (((list (string 'list)) (list "LIST")) t)))))

(with-test (:name (sb-c::mask-signed-field :randomized))
  (let (result)
    (dotimes (i 1000)
      (let* ((ool (checked-compile '(lambda (s i)
                                     (sb-c::mask-signed-field s i))))
             (size (random (* sb-vm:n-word-bits 2)))
             (constant (checked-compile `(lambda (i)
                                           (sb-c::mask-signed-field ,size i))))
             (arg (- (random (* most-positive-fixnum 8)) (* most-positive-fixnum 4)))
             (declared (checked-compile `(lambda (i)
                                           (declare (type (integer ,(- (abs arg)) ,(abs arg)) i))
                                           (sb-c::mask-signed-field ,size i))))
             (ool-answer (funcall ool size arg))
             (constant-answer (funcall constant arg))
             (declared-answer (funcall declared arg)))
        (unless (= ool-answer constant-answer declared-answer)
          (push (list size arg ool-answer constant-answer declared-answer) result))))
    (assert (null result))))

(with-test (:name (multiple-value-call :type-checking-rest))
  (checked-compile-and-assert (:allow-warnings t
                               :optimize :safe)
      `(lambda (list)
         (multiple-value-call
             (lambda (&optional a &rest r)
               (declare ((satisfies eval) r)
                        (ignore r))
               (list a))
           (values-list list)))
    (('(1 list 2)) '(1))
    (('(1)) (condition 'type-error))))

(with-test (:name (multiple-value-call :type-checking-rest.2))
  (checked-compile-and-assert (:allow-warnings t
                               :optimize :safe)
      `(lambda (list)
         (multiple-value-call
             (lambda (&optional a &rest r)
               (declare (null r)
                        (ignore r))
               (list a))
           (values-list list)))
    (('(1 list 2)) (condition 'type-error))
    (('(1)) '(1))))

(with-test (:name (multiple-value-call :type-checking-rest :type-derivation))
  (checked-compile-and-assert (:allow-warnings t
                               :optimize :safe)
      `(lambda (list)
         (multiple-value-call
             (lambda (&optional a &rest r)
               (declare (cons r)
                        (ignore r))
               (list a))
           (values-list list)))
    (('(1 2)) '(1))
    (('(1)) (condition 'type-error))))