diff --git a/mats/cptypes.ms b/mats/cptypes.ms index 0433672f35..0f06b004cb 100644 --- a/mats/cptypes.ms +++ b/mats/cptypes.ms @@ -26,6 +26,36 @@ #;[optimize-level (max (optimize-level) 2)]) (expand/optimize y)))])) +(define-syntax cptypes/nocp0-equivalent-expansion? + (syntax-rules () + [(_ x y) + (equivalent-expansion? + (parameterize ([enable-cp0 #f] + [#%$suppress-primitive-inlining #f] + #;[optimize-level (max (optimize-level) 2)]) + (expand/optimize x)) + (parameterize ([enable-cp0 #f] + [#%$suppress-primitive-inlining #f] + #;[optimize-level (max (optimize-level) 2)]) + (expand/optimize y)))])) + +(define-syntax cptypes/nocp0/alternative-equivalent-expansion? + (syntax-rules () + [(_ x y) + (equivalent-expansion? + (parameterize ([enable-cp0 #f] + [enable-type-recovery #f] + [run-cp0 (lambda (cp0 c) (#3%$cptypes c))] + [#%$suppress-primitive-inlining #f] + #;[optimize-level (max (optimize-level) 2)]) + (expand/optimize x)) + (parameterize ([enable-cp0 #f] + [enable-type-recovery #f] + [run-cp0 (lambda (cp0 c) (#3%$cptypes c))] + [#%$suppress-primitive-inlining #f] + #;[optimize-level (max (optimize-level) 2)]) + (expand/optimize y)))])) + (mat cptypes-handcoded (cptypes-equivalent-expansion? '(vector? (vector)) ;actually reduced by folding, not cptypes @@ -45,6 +75,12 @@ (cptypes-equivalent-expansion? '(pair? (cons 1 2)) #t) + (cptypes-equivalent-expansion? + '(pair? (list 1 2)) + #t) + (cptypes-equivalent-expansion? + '(pair? (list)) + #f) (cptypes-equivalent-expansion? '(lambda (x) (vector-set! x 0 0) (vector? x)) '(lambda (x) (vector-set! x 0 0) #t)) @@ -629,3 +665,33 @@ '(lambda (x) (when (number? x) (#2%odd? x))) '(lambda (x) (when (number? x) (#3%odd? x))))) ) + +(mat cptypes-rest-argument + (cptypes/nocp0-equivalent-expansion? + '((lambda (x . r) (pair? r)) 1) + '((lambda (x . r) #f) 1)) + (cptypes/nocp0-equivalent-expansion? + '((lambda (x . r) (null? r)) 1) + '((lambda (x . r) #t) 1)) + (cptypes/nocp0-equivalent-expansion? + '((lambda (x . r) (pair? r)) 1 2) + '((lambda (x . r) #t) 1 2)) + (cptypes/nocp0-equivalent-expansion? + '((lambda (x . r) (null? r)) 1 2) + '((lambda (x . r) #f) 1 2)) +) + +(mat cptypes-rest-argument/alternative + (cptypes/nocp0/alternative-equivalent-expansion? + '((lambda (x . r) (pair? r)) 1) + '((lambda (x . r) #f) 1)) + (cptypes/nocp0/alternative-equivalent-expansion? + '((lambda (x . r) (null? r)) 1) + '((lambda (x . r) #t) 1)) + (cptypes/nocp0/alternative-equivalent-expansion? + '((lambda (x . r) (pair? r)) 1 2) + '((lambda (x . r) #t) 1 2)) + (cptypes/nocp0/alternative-equivalent-expansion? + '((lambda (x . r) (null? r)) 1 2) + '((lambda (x . r) #f) 1 2)) +) diff --git a/s/cptypes.ss b/s/cptypes.ss index 9acb0ab52d..c940bd221c 100644 --- a/s/cptypes.ss +++ b/s/cptypes.ss @@ -195,7 +195,8 @@ Notes: (set! ret (pred-env-add/key ret key (pred-intersect x z))))) (lambda (key x) (set! ret (pred-env-add/key ret key x))) - (lambda (key x) (error 'pred-env-intersect/base "") (void)) + (lambda (key x) + ($impoops 'pred-env-intersect/base "unexpected value ~s in base environment ~s" x base)) from base) ret)])) @@ -233,7 +234,8 @@ Notes: ;x-> from ;z-> types (set! ret (pred-env-add/key ret key (pred-union x z))))) - (lambda (key x) (error 'pred-env-union/base "") (void)) + (lambda (key x) + ($impoops 'pred-env-union/from "unexpected value ~s in base environment ~s" x base)) from base) ret)) @@ -288,7 +290,8 @@ Notes: (if (eq? x z) (set! ret (fxmap-reset/base ret key new-base)) (set! ret (fxmap-advance/base ret key new-base))))) - (lambda (key x) (error 'pred-env-rebase "") (void)) + (lambda (key x) + ($impoops 'pred-env-rebase "unexpected value ~s in base environment ~s" x base)) new-base base) ret)) @@ -843,6 +846,13 @@ Notes: (pred-env-add/ref types (car e*) pred)) #f)]))] ; TODO: special case for call-with-values. + [(eq? (primref-name pr) 'list) + (cond + [(null? e*) + ;should have be reduced by cp0 + (values null-rec null-rec t #f #f)] + [else + (values `(call ,preinfo ,pr ,e* ...) 'pair t #f #f)])] [(and (fx= (length e*) 1) (eq? (primref-name pr) 'exact?)) (cond @@ -940,7 +950,7 @@ Notes: (fold-left pred-env-add t x* (let f ([i nfixed] [r* r*]) (if (fx= i 0) - (list (if (null? r*) 'null 'pair)) + (list (if (null? r*) null-rec 'pair)) (cons (car r*) (f (fx- i 1) (cdr r*)))))))) (lambda () (values ir 'bottom types #f #f))))] [(call ,preinfo ,[e0 'value types -> e0 ret0 types0 t-types0 f-types0]