Make union simplification not happen during subtyping.

Union simplification calls subtype, calling subtype during subtyping is
slow so we want to avoid it.

Closes PR 14582.
This commit is contained in:
Eric Dobson 2014-06-29 22:49:51 -07:00
parent 864cda2614
commit cfe35fa0a4
2 changed files with 38 additions and 1 deletions

View File

@ -3,7 +3,7 @@
(require "../utils/utils.rkt"
(rep type-rep rep-utils)
(prefix-in c: (contract-req))
(types subtype base-abbrev resolve)
(types subtype base-abbrev resolve current-seen)
racket/match
racket/list)
@ -21,6 +21,8 @@
;; a is a Type (not a union type)
;; b is a List[Type] (non overlapping, non Union-types)
;; The output is a non overlapping list of non Union types.
;; The overlapping constraint is lifted if we are in the midst of subtyping. This is because during
;; subtyping calls to subtype are expensive.
(define (merge a b)
(define b* (make-union* b))
(match* (a b)
@ -32,6 +34,7 @@
;; so that bad applications are rejected early.
(resolve-app-check-error rator rands stx)
(cons a b)]
[(_ _) #:when (currently-subtyping?) (cons a b)]
[((? (λ _ (subtype a b*))) _) b]
[((? (λ _ (subtype b* a))) _) (list a)]
[(_ _) (cons a (filter-not (λ (b-elem) (subtype b-elem a)) b))]))

View File

@ -0,0 +1,34 @@
#lang typed/racket/base
(define-type CodeOfBoolean (Code Boolean))
(define-type CodeOfInteger (Code Integer))
(define-type CodeOfAny
(U CodeOfInteger
CodeOfBoolean))
(define-type (Code Type)
(U Type
(If Type)
(Begin Type)))
(struct (Type) If
([cond : CodeOfBoolean]
[then : (Code Type)]
[else : (Code Type)])
#:transparent)
(define-type (ListEndingIn ListType EndType)
(U (Pair EndType Null)
(Pair ListType (ListEndingIn ListType EndType))))
(struct (Type) Begin
([exprs : (ListEndingIn CodeOfAny (Code Type))]))
(define QuotedCode : CodeOfInteger
(If #t
1
(Begin
(list 2 #f (If #t 3 4)))))