~ chicken-core (chicken-5) c23fdb83dda6909f783f4f53e6ee54df758a4e02


commit c23fdb83dda6909f783f4f53e6ee54df758a4e02
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Wed Mar 2 09:18:16 2011 -0500
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Wed Mar 2 09:18:16 2011 -0500

    types.db work

diff --git a/scrutinizer.scm b/scrutinizer.scm
index 80d39451..55f3ef20 100755
--- a/scrutinizer.scm
+++ b/scrutinizer.scm
@@ -714,6 +714,10 @@
 	     ((and) (every (cut match <> t) (cdr st)))
 	     (else (equal? st t))))
 	  ((eq? st '*))
+	  ((eq? st 'procedure)
+	   (or (eq? t 'procedure)
+	       (and (pair? t) (eq? 'procedure (car t)))))
+	  ;;XXX match number with fixnum and float?
 	  (else (eq? st t))))
   (let loop ((tl typelist) (atypes atypes))
     (cond ((null? tl) (null? atypes))
diff --git a/types.db b/types.db
index b2faae22..a8658a84 100644
--- a/types.db
+++ b/types.db
@@ -133,83 +133,122 @@
 (rational? (procedure rational? (*) boolean)
 	   ((fixnum) (let ((#:tmp #(1))) #t)))
 
-(zero? (procedure zero? (number) boolean)
-       ((fixnum) (eq? #(1) 0)))
+(zero? (procedure zero? (number) boolean) 
+       ((fixnum) (eq? #(1) 0))
+       ((number) (##core#inline "C_u_i_zerop" #(1))))
+
+(odd? (procedure odd? (number) boolean) ((fixnum) (fxodd? #(1))))
+(even? (procedure even? (number) boolean) ((fixnum) (fxeven? #(1)))
+
+(positive? (procedure positive? (number) boolean)
+	   ((fixnum) (##core#inline "C_fixnum_greaterp" #(1) 0))
+	   ((number) (##core#inline "C_u_i_positivep" #(1))))
+
+(negative? (procedure negative? (number) boolean)
+	   ((fixnum) (##core#inline "C_fixnum_lessp" #(1) 0))
+	   ((number) (##core#inline "C_u_i_negativep" #(1))))
 
-;;XXX...
-(odd? (procedure odd? (number) boolean))
-(even? (procedure even? (number) boolean))
-(positive? (procedure positive? (number) boolean))
-(negative? (procedure negative? (number) boolean))
 (max (procedure max (#!rest number) number)
+     ((fixnum fixnum) (fxmax #(1) #(2)))
      ((float float) (fpmax #(1) #(2))))
+
 (min (procedure min (#!rest number) number)
+     ((fixnum fixnum) (fxmin #(1) #(2)))
      ((float float) (fpmin #(1) #(2))))
+
 (+ (procedure + (#!rest number) number)
+   ((fixnum fixnum) (##core#inline "C_u_fixnum_plus" #(1) #(2)))
    ((float float) (fp+ #(1) #(2))))
+
 (- (procedure - (number #!rest number) number)
+   ((fixnum fixnum) (##core#inline "C_i_fixnum_difference" #(1) #(2)))
+   ((fixnum) (##core#inline "C_u_fixnum_negate" #(1)))
    ((float float) (fp- #(1) #(2)))
    ((float) (fpneg #(1))))
+
 (* (procedure * (#!rest number) number)
+   ((fixnum fixnum) (##core#inline "C_fixnum_times" #(1) #(2)))
    ((float float) (fp* #(1) #(2))))
+
 (/ (procedure / (number #!rest number) number)
+   ((fixnum fixnum) (##core#inline "C_fixnum_divide" #(1) #(2)))
    ((float float) (fp/ #(1) #(2))))
+
 (= (procedure = (#!rest number) boolean)
    ((fixnum fixnum) (eq? #(1) #(2)))
    ((float float) (fp= #(1) #(2))))
+
 (> (procedure > (#!rest number) boolean)
    ((fixnum fixnum) (fx> #(1) #(2)))
    ((float float) (fp> #(1) #(2))))
+
 (< (procedure < (#!rest number) boolean)
    ((fixnum fixnum) (fx< #(1) #(2)))
    ((float float) (fp< #(1) #(2))))
+
 (>= (procedure >= (#!rest number) boolean)
     ((fixnum fixnum) (fx>= #(1) #(2)))
     ((float float) (fp>= #(1) #(2))))
+
 (<= (procedure <= (#!rest number) boolean)
     ((fixnum fixnum) (fx<= #(1) #(2)))
     ((float float) (fp<= #(1) #(2))))
-(quotient (procedure quotient (number number) number))
-(remainder (procedure remainder (number number) number))
+
+(quotient (procedure quotient (number number) number)
+	  ((fixnum fixnum) (##core#inline "C_fixnum_divide" #(1) #(2))))
+
+(remainder (procedure remainder (number number) number)
+	   ((fixnum fixnum) (##core#inline "C_fixnum_modulo" #(1) #(2))))
+
 (modulo (procedure modulo (number number) number))
-(gcd (procedure gcd (#!rest number) number))
-(lcm (procedure lcm (#!rest number) number))
+
+(gcd (procedure gcd (#!rest number) number) ((* *) (##sys#gcd #(1) #(2))))
+(lcm (procedure lcm (#!rest number) number) ((* *) (##sys#lcm #(1) #(2))))
+
 (abs (procedure abs (number) number)
+     ((fixnum) (##core#inline "C_fixnum_abs" #(1)))
      ((float) (fpabs #(1))))
+
 (floor (procedure floor (number) number)
+       ((fixnum) #(1))
        ((float) (fpfloor #(1))))
+
 (ceiling (procedure ceiling (number) number)
+	 ((fixnum) #(1))
 	 ((float) (fpceiling #(1))))
+
 (truncate (procedure truncate (number) number)
+	  ((fixnum) #(1))
 	  ((float) (fptruncate #(1))))
+
 (round (procedure round (number) number)
+       ((fixnum) #(1))
        ((float) (fpround #(1))))
-(exact->inexact (procedure exact->inexact (number) number))
-(inexact->exact (procedure inexact->exact (number) number))
-(exp (procedure exp (number) float)
-     ((float) (fpexp #(1))))
-(log (procedure log (number) float)
-     ((float) (fplog #(1))))
-(expt (procedure expt (number number) number)
-      ((float) (fpexpt #(1))))
-(sqrt (procedure sqrt (number) float)
-      ((float) (fpsqrt #(1))))
-(sin (procedure sin (number) float)
-     ((float) (fpsin #(1))))
-(cos (procedure cos (number) float)
-     ((float) (fpcos #(1))))
-(tan (procedure tan (number) float)
-     ((float) (fptab #(1))))
-(asin (procedure asin (number) float)
-      ((float) (fpasin #(1))))
-(acos (procedure acos (number) float)
-      ((float) (fpacos #(1))))
+
+(exact->inexact (procedure exact->inexact (number) number) ((float) #(1)))
+(inexact->exact (procedure inexact->exact (number) number) ((fixnum) #(1)))
+
+(exp (procedure exp (number) float) ((float) (fpexp #(1))))
+(log (procedure log (number) float) ((float) (fplog #(1))))
+(expt (procedure expt (number number) number) ((float) (fpexpt #(1))))
+(sqrt (procedure sqrt (number) float) ((float) (fpsqrt #(1))))
+(sin (procedure sin (number) float) ((float) (fpsin #(1))))
+(cos (procedure cos (number) float) ((float) (fpcos #(1))))
+(tan (procedure tan (number) float) ((float) (fptan #(1))))
+(asin (procedure asin (number) float) ((float) (fpasin #(1))))
+(acos (procedure acos (number) float) ((float) (fpacos #(1))))
+
 (atan (procedure atan (number #!optional number) float)
       ((float) (fpatan #(1)))
       ((float float) (fpatan2 #(1) #(2))))
+
 (number->string (procedure number->string (number #!optional number) string))
 (string->number (procedure string->number (string #!optional number) (or number boolean)))
-(char? (procedure char? (*) boolean))
+
+(char? (procedure char? (*) boolean)
+       ((char) (let ((#:tmp #(1))) #t))
+       (((not char)) (let ((#:tmp #(1))) #f)))
+
 (char=? (procedure char=? (char char) boolean))
 (char>? (procedure char>? (char char) boolean))
 (char<? (procedure char<? (char char) boolean))
@@ -229,8 +268,14 @@
 (char-downcase (procedure char-downcase (char) char))
 (char->integer (procedure char->integer (char) fixnum))
 (integer->char (procedure integer->char (fixnum) char))
-(string? (procedure string? (*) boolean))
-(string=? (procedure string=? (string string) boolean))
+
+(string? (procedure string? (*) boolean)
+	 ((string) (let ((#:tmp #(1))) #t))
+	 (((not string)) (let ((#:tmp #(1))) #f)))
+
+(string=? (procedure string=? (string string) boolean)
+	  ((string string) (##core#inline "C_u_i_string_equal_p" #(1) #(2))))
+
 (string>? (procedure string>? (string string) boolean))
 (string<? (procedure string<? (string string) boolean))
 (string>=? (procedure string>=? (string string) boolean))
@@ -240,28 +285,53 @@
 (string-ci>? (procedure string-ci>? (string string) boolean))
 (string-ci>=? (procedure string-ci>=? (string string) boolean))
 (string-ci<=? (procedure string-ci<=? (string string) boolean))
-(make-string (procedure make-string (fixnum #!optional char) string))
-(string-length (procedure string-length (string) fixnum))
-(string-ref (procedure string-ref (string fixnum) char))
-(string-set! (procedure string-set! (string fixnum char) undefined))
-(string-append (procedure string-append (#!rest string) string))
+
+(make-string (procedure make-string (fixnum #!optional char) string)
+	     ((fixnum char) (##sys#make-string #(1) #(2)))
+	     ((fixnum) (##sys#make-string #(1) #\space)))
+
+(string-length (procedure string-length (string) fixnum)
+	       ((string) (##sys#size #(1))))
+
+(string-ref (procedure string-ref (string fixnum) char)
+	    ((string fixnum) (##core#inline "C_subchar" #(1) #(2))))
+
+(string-set! (procedure string-set! (string fixnum char) undefined)
+	     ((string fixnum char) (##core#inline "C_setsubchar" #(1) #(2) #(3))))
+
+(string-append (procedure string-append (#!rest string) string)
+	       ((string string) (##sys#string-append #(1) #(2))))
+
 ;(string-copy (procedure string-copy (string) string)) - we use the more general version from srfi-13
+
 (string->list (procedure string->list (string) list))
 (list->string (procedure list->string (list) string))
 (substring (procedure substring (string fixnum #!optional fixnum) string))
 (string-fill! (procedure string-fill! (string char) string))
-(vector? (procedure vector? (*) boolean))
+(string (procedure string (#!rest char) string))
+
+(vector? (procedure vector? (*) boolean)
+	 ((vector) (let ((#:tmp #(1))) #t))
+	 (((not vector)) (let ((#:tmp #(1))) #f)))
+
 (make-vector (procedure make-vector (fixnum #!optional *) vector))
+
 (vector-ref (procedure vector-ref (vector fixnum) *))
 (vector-set! (procedure vector-set! (vector fixnum *) undefined))
-(string (procedure string (#!rest char) string))
 (vector (procedure vector (#!rest) vector))
-(vector-length (procedure vector-length (vector) fixnum))
+
+(vector-length (procedure vector-length (vector) fixnum)
+	       ((vector) (##sys#size #(1))))
+
 (vector->list (procedure vector->list (vector) list))
 (list->vector (procedure list->vector (list) vector))
 (vector-fill! (procedure vector-fill! (vector *) vector))
 (vector-copy! (procedure vector-copy! (vector vector fixnum) undefined))
-(procedure? (procedure procedure? (*) boolean))
+
+(procedure? (procedure procedure? (*) boolean)
+	    ((procedure) (let ((#:tmp #(1))) #t))
+	    (((not procedure) (let ((#:tmp #(1))) #f)))) ;XXX test this!
+
 (map (procedure map (procedure #!rest list) list))
 (for-each (procedure for-each (procedure #!rest list) undefined))
 (apply (procedure apply (procedure #!rest) . *))
@@ -279,9 +349,14 @@
 (close-output-port (procedure close-output-port (port) undefined))
 (load (procedure load (string #!optional procedure) undefined))
 (read (procedure read (#!optional port) *))
-(eof-object? (procedure eof-object? (*) boolean))
+
+(eof-object? (procedure eof-object? (*) boolean)
+	     (((not eof)) (let ((#:tmp #(1))) #f)))
+
+;;XXX if we had input/output port distinction, we could specialize these:
 (read-char (procedure read-char (#!optional port) *)) ; result (or eof char) ?
 (peek-char (procedure peek-char (#!optional port) *))
+
 (write (procedure write (* #!optional port) undefined))
 (display (procedure display (* #!optional port) undefined))
 (write-char (procedure write-char (char #!optional port) undefined))
@@ -293,18 +368,34 @@
 (call-with-values (procedure call-with-values (procedure procedure) . *))
 (eval (procedure eval (* #!optional *) *))
 (char-ready? (procedure char-ready? (#!optional port) boolean))
-(imag-part (procedure imag-part (number) number))
-(real-part (procedure real-part (number) number))
-(magnitude (procedure magnitude (number) number))
-(numerator (procedure numerator (number) number))
-(denominator (procedure denominator (number) number))
+
+(imag-part (procedure imag-part (number) number)
+	   ((or fixnum float number) (let ((#:tmp #(1))) 0)))
+
+(real-part (procedure real-part (number) number)
+	   ((or fixnum float number) #(1)))
+
+(magnitude (procedure magnitude (number) number)
+	   ((fixnum) (##core#inline "C_fixnum_abs" #(1)))
+	   ((float) (fpabs #(1))))
+
+(numerator (procedure numerator (number) number)
+	   ((fixnum) #(1)))
+	   
+(denominator (procedure denominator (number) number)
+	     ((fixnum) (let ((#:tmp #(1))) 1)))
+
 (scheme-report-environment (procedure scheme-report-environment (#!optional fixnum) *))
 (null-environment (procedure null-environment (#!optional fixnum) *))
 (interaction-environment (procedure interaction-environment () *))
-(port-closed? (procedure port-closed? (port) boolean))
+
+(port-closed? (procedure port-closed? (port) boolean)
+	      ((port) (##sys#slot #(1) 8)))
 
 ;; chicken
 
+;;XXX...
+
 (abort (procedure abort (*) noreturn))
 (add1 (procedure add1 (number) number))
 (argc+argv (procedure argc+argv () fixnum list))
Trap