diff --git a/s/cptypes.ss b/s/cptypes.ss index f08867cda2..73954d1a8d 100644 --- a/s/cptypes.ss +++ b/s/cptypes.ss @@ -1033,6 +1033,57 @@ Notes: [else (values `(call ,preinfo ,pr ,n) ret ntypes #f #f)]))]) + (define-specialize 2 atan + [(n) (let ([r (get-type n)]) + (cond + [(predicate-implies-not? r 'number) + (values `(call ,preinfo ,pr ,n) + 'bottom pred-env-bottom #f #f)] + [else + (values `(call ,preinfo ,pr ,n) ret + (pred-env-add/ref ntypes n 'number plxc) #f #f)]))] + [(x y) (let ([rx (get-type x)] + [ry (get-type y)]) + (cond + [(or (predicate-implies-not? rx 'real) + (predicate-implies-not? ry 'real)) + (values `(call ,preinfo ,pr ,x ,y) + 'bottom pred-env-bottom #f #f)] + [else + (values `(call ,preinfo ,pr ,x ,y) ret + (pred-env-add/ref (pred-env-add/ref ntypes + x 'real plxc) + y 'real plxc) + #f #f)]))]) + + (define-specialize 2 char-name + [(n) (let ([r (get-type n)] + [ir `(call ,preinfo ,pr ,n)]) + (cond + [(predicate-implies? r 'char) + (values ir 'ptr ntypes #f #f)] ; should be maybe-symbol + [(predicate-implies? r 'symbol) + (values ir 'ptr ntypes #f #f)] ; should be maybe-char + [(and (predicate-implies-not? r 'char) + (predicate-implies-not? r 'symbol)) + (values ir 'bottom pred-env-bottom #f #f)] + [else + (values ir 'ptr ; should be maybe-(union 'char 'symbol) + (pred-env-add/ref ntypes n 'true plxc) #f #f)]))] ; should be (union 'char 'symbol) + [(n c) (let ([rn (get-type n)] + [rc (get-type c)] + [ir `(call ,preinfo ,pr ,n ,c)]) + (cond + [(or (predicate-implies-not? rn 'symbol) + (predicate-implies-not? rc 'ptr)) ; should be maybe-char + (values ir 'bottom pred-env-bottom #f #f)] + [else + (values ir void-rec + (pred-env-add/ref (pred-env-add/ref ntypes + n 'symbol plxc) + c 'ptr plxc) ; should be maybe-char + #f #f)]))]) + (define-specialize/unrestricted 2 call-with-values [(e1 e2) (let-values ([(e1 ret1 types1 t-types1 f-types1) (Expr/call e1 'value oldtypes oldtypes plxc)]) diff --git a/s/primdata.ss b/s/primdata.ss index 4861035d14..9c1d06d7f3 100644 --- a/s/primdata.ss +++ b/s/primdata.ss @@ -238,7 +238,7 @@ (tan [sig [(number) -> (number)]] [flags arith-op mifoldable discard ieee r5rs]) (asin [sig [(number) -> (number)]] [flags arith-op mifoldable discard ieee r5rs]) (acos [sig [(number) -> (number)]] [flags arith-op mifoldable discard ieee r5rs]) - (atan [sig [(number) (real real) -> (number)]] [flags arith-op mifoldable discard ieee r5rs]) + (atan [sig [(number) (real real) -> (number)]] [flags arith-op mifoldable discard cptypes2 ieee r5rs]) (sqrt [sig [(number) -> (number)]] [flags arith-op mifoldable discard ieee r5rs]) (exact-integer-sqrt [sig [(exact-integer) -> (exact-integer exact-integer)]] [flags discard discard]) ; could be mifoldable if multiple values were handled (expt [sig [(number number) -> (number)]] [flags pure discard true cp02 ieee r5rs]) ; can take too long to fold @@ -1215,7 +1215,7 @@ (char-ci=? [sig [(char char ...) -> (boolean)]] [flags pure mifoldable discard cp03 safeongoodargs]) ; not restricted to 2+ arguments (char-ci>=? [sig [(char char ...) -> (boolean)]] [flags pure mifoldable discard safeongoodargs]) ; not restricted to 2+ arguments (char-ci>? [sig [(char char ...) -> (boolean)]] [flags pure mifoldable discard safeongoodargs]) ; not restricted to 2+ arguments - (char-name [sig [(sub-ptr) (sub-symbol maybe-char) -> (ptr)]] [flags]) + (char-name [sig [(sub-ptr) (sub-symbol maybe-char) -> (ptr)]] [flags cptypes2]) (char-ready? [sig [() (textual-input-port) -> (boolean)]] [flags ieee r5rs]) (chmod [sig [(pathname sub-ufixnum) -> (void)]] [flags]) (clear-input-port [sig [() (input-port) -> (void)]] [flags true])