From 295a4b7e39d1e96fa8b7544990c3ecfc37106737 Mon Sep 17 00:00:00 2001 From: Asumu Takikawa Date: Mon, 13 Jun 2016 00:50:13 -0400 Subject: [PATCH] Simplify flat contracts for Value types Potentially speeds up contracts checks for types like False or Boolean. --- typed-racket-lib/typed-racket/private/type-contract.rkt | 6 +++++- typed-racket-test/succeed/cast-mod.rkt | 2 +- typed-racket-test/succeed/cast-top-level.rkt | 2 +- typed-racket-test/unit-tests/contract-tests.rkt | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/typed-racket-lib/typed-racket/private/type-contract.rkt b/typed-racket-lib/typed-racket/private/type-contract.rkt index 2d175dc6..54e78552 100644 --- a/typed-racket-lib/typed-racket/private/type-contract.rkt +++ b/typed-racket-lib/typed-racket/private/type-contract.rkt @@ -626,7 +626,11 @@ [(Syntax: t) (syntax/sc (t->sc t))] [(Value: v) - (flat/sc #`(flat-named-contract '#,v (lambda (x) (equal? x '#,v))) v)] + (if (and (c:flat-contract? v) + ;; regexps don't match themselves when used as contracts + (not (regexp? v))) + (flat/sc #`(quote #,v)) + (flat/sc #`(flat-named-contract '#,v (lambda (x) (equal? x '#,v))) v))] [(Param: in out) (parameter/sc (t->sc in) (t->sc out))] [(Hashtable: k v) diff --git a/typed-racket-test/succeed/cast-mod.rkt b/typed-racket-test/succeed/cast-mod.rkt index 3c9762a2..803ac2f5 100644 --- a/typed-racket-test/succeed/cast-mod.rkt +++ b/typed-racket-test/succeed/cast-mod.rkt @@ -35,7 +35,7 @@ (check-equal? v #f) (check-equal? ((cast f (Boolean -> Boolean)) #t) #t) (check-equal? v #t) - (check-exn #rx"expected: \\(or/c #f #t\\)\n *given: \"hello\"" + (check-exn #rx"expected: boolean\\?\n *given: \"hello\"" (λ () ((cast f (String -> String)) "hello"))) (check-equal? v #t "if the previous test hadn't errored, this would be \"hello\" with type Boolean")) diff --git a/typed-racket-test/succeed/cast-top-level.rkt b/typed-racket-test/succeed/cast-top-level.rkt index e849e50e..a56b71e9 100644 --- a/typed-racket-test/succeed/cast-top-level.rkt +++ b/typed-racket-test/succeed/cast-top-level.rkt @@ -42,7 +42,7 @@ (check-equal? v #f) (check-equal? ((cast f (Boolean -> Boolean)) #t) #t) (check-equal? v #t) - (check-exn #rx"expected: \\(or/c #f #t\\)\n *given: \"hello\"" + (check-exn #rx"expected: boolean\\?\n *given: \"hello\"" (λ () ((cast f (String -> String)) "hello"))) (check-equal? v #t "if the previous test hadn't errored, this would be \"hello\" with type Boolean")) diff --git a/typed-racket-test/unit-tests/contract-tests.rkt b/typed-racket-test/unit-tests/contract-tests.rkt index 81746371..a040645e 100644 --- a/typed-racket-test/unit-tests/contract-tests.rkt +++ b/typed-racket-test/unit-tests/contract-tests.rkt @@ -237,7 +237,7 @@ (lambda (f) (f 6)) (lambda (x) 'bad) #:untyped - #:msg #rx"promised: \\(or/c #f #t\\).*produced: 'bad.*blaming: untyped") + #:msg #rx"promised: boolean\\?.*produced: 'bad.*blaming: untyped") ;; Struct predicates should not have a contract (t-int ctc (lambda (foo?)