finish (-> void?) optimization

This commit is contained in:
Robby Findler 2016-08-18 13:02:03 -05:00
parent bd2f889251
commit 8df0d6bba3
4 changed files with 150 additions and 5 deletions

View File

@ -485,6 +485,36 @@
((impersonate-procedure s? (λ (x) (values (λ (r) "") x))) 11))
'pos 'neg))
(test/spec-passed/result
'->void.1
'(void? ((contract (-> void?) void 'pos 'neg)))
#t)
(test/spec-passed/result
'->void.2
'(void? ((contract (-> void?) (λ () (void)) 'pos 'neg)))
#t)
(test/spec-passed/result
'->void.3
'(void? ((contract (-> void?) (λ args void) 'pos 'neg)))
#t)
(test/pos-blame
'->void.4
'((contract (-> void?) (λ args 11) 'pos 'neg))
#t)
(test/pos-blame
'->void.5
'((contract (-> void?) (λ args (values (void) (void))) 'pos 'neg))
#t)
(test/pos-blame
'->void.6
'(contract (-> void?) 'not-a-function 'pos 'neg)
#t)
(test/pos-blame
'->void.7
'(contract (-> void?) (λ (x) 1) 'pos 'neg)
#t)
(test/spec-passed
'any/c-in-domain1
'((contract (-> any/c real?)

View File

@ -1080,6 +1080,122 @@
(define f 1)))
(eval '(dynamic-require ''provide/contract56-m1 #f)))
"provide/contract56-m1")
(test/spec-failed
'provide/contract57
'(let ()
(eval '(module provide/contract57-m1 racket/base
(require racket/contract/base)
(provide
(contract-out
[f (-> any/c boolean?)]))
(define f 1)))
(eval '(dynamic-require ''provide/contract57-m1 #f)))
"provide/contract57-m1")
(test/spec-passed/result
'provide/contract58
'(let ()
(eval '(module provide/contract58-m1 racket/base
(require racket/contract/base)
(provide
(contract-out
[f (-> any/c boolean?)]))
(define (f x) #t)))
(eval '(module provide/contract58-m2 racket/base
(require 'provide/contract58-m1)
(provide a)
(define a (f 1))))
(eval '(dynamic-require ''provide/contract58-m2 'a)))
#t)
(test/spec-failed
'provide/contract59
'(let ()
(eval '(module provide/contract59-m1 racket/base
(require racket/contract/base)
(provide
(contract-out
[f (-> any/c boolean?)]))
(define (f x) 11)))
(eval '(module provide/contract59-m2 racket/base
(require 'provide/contract59-m1)
(f 1)))
(eval '(dynamic-require ''provide/contract59-m2 #f)))
"provide/contract59-m1")
(test/spec-failed
'provide/contract60
'(let ()
(eval '(module provide/contract60-m1 racket/base
(require racket/contract/base)
(provide
(contract-out
[f (-> any/c boolean?)]))
(define (f x) (values #t #t))))
(eval '(module provide/contract60-m2 racket/base
(require 'provide/contract60-m1)
(f 1)))
(eval '(dynamic-require ''provide/contract60-m2 #f)))
"provide/contract60-m1")
(test/spec-passed/result
'provide/contract61
'(let ()
(eval '(module provide/contract61-m1 racket/base
(require racket/contract/base)
(provide
(contract-out
[f (-> void?)]))
(define (f) (void))))
(eval '(module provide/contract61-m2 racket/base
(require 'provide/contract61-m1)
(provide a)
(define a (f))))
(eval '(void? (dynamic-require ''provide/contract61-m2 'a))))
#t)
(test/spec-failed
'provide/contract62
'(let ()
(eval '(module provide/contract62-m1 racket/base
(require racket/contract/base)
(provide
(contract-out
[f (-> void?)]))
(define f 1)))
(eval '(dynamic-require ''provide/contract62-m1 #f)))
"provide/contract62-m1")
(test/spec-failed
'provide/contract63
'(let ()
(eval '(module provide/contract63-m1 racket/base
(require racket/contract/base)
(provide
(contract-out
[f (-> void?)]))
(define (f) 11)))
(eval '(module provide/contract63-m2 racket/base
(require 'provide/contract63-m1)
(f)))
(eval '(dynamic-require ''provide/contract63-m2 #f)))
"provide/contract63-m1")
(test/spec-failed
'provide/contract64
'(let ()
(eval '(module provide/contract64-m1 racket/base
(require racket/contract/base)
(provide
(contract-out
[f (-> void?)]))
(define (f) (values #t #t))))
(eval '(module provide/contract64-m2 racket/base
(require 'provide/contract64-m1)
(f)))
(eval '(dynamic-require ''provide/contract64-m2 #f)))
"provide/contract64-m1")
(contract-error-test

View File

@ -69,6 +69,9 @@
(test-name 'predicate/c predicate/c)
(test-name '(-> integer? any/c ... boolean? any) (-> integer? any/c ... boolean? any))
(test-name '(-> boolean?) (-> boolean?))
(test-name '(-> void?) (-> void?))
(test-name '(->* (integer?) (string?) #:rest any/c (values char? any/c))
(->* (integer?) (string?) #:rest any/c (values char? any/c)))

View File

@ -954,10 +954,6 @@
(for/list ([rng (in-list raw-rngs)])
(coerce-contract who rng))))
(cond
;; uncomment this to specialize (-> void) contract to a
;; more efficient wrapper (but there are no test cases for
;; that code, so add them before pushing this)
#;
[(and (null? regular-doms)
(null? kwd-infos)
(not rest-ctc)
@ -1447,7 +1443,7 @@
(make--> 0 '() '() #f #f
(list (coerce-contract 'whatever void?))
#f
(λ (blame f _ignored-rng-ctcs _ignored-rng-proj)
(λ (blame f _ignored)
(values
(λ (neg-party)
(call-with-values/check-range