~ chicken-core (chicken-5) 1f91b0b79e562bd0881b1589b1f375a5fc712de0
commit 1f91b0b79e562bd0881b1589b1f375a5fc712de0 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Tue Jun 15 14:36:27 2010 +0200 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Tue Jun 15 14:36:27 2010 +0200 don't rewrite hooks for exactness-conversion; optimized some uses diff --git a/c-platform.scm b/c-platform.scm index ddc039f9..a1d0c5f7 100644 --- a/c-platform.scm +++ b/c-platform.scm @@ -720,7 +720,6 @@ (rewrite '##sys#vector-length 2 1 "C_i_vector_length" #t) (rewrite 'string-length 2 1 "C_i_string_length" #t) (rewrite 'inexact->exact 2 1 "C_i_inexact_to_exact" #t) -(rewrite '##sys#inexact->exact 2 1 "C_i_inexact_to_exact" #t) (rewrite '##sys#check-exact 2 1 "C_i_check_exact" #t) (rewrite '##sys#check-number 2 1 "C_i_check_number" #t) @@ -799,7 +798,6 @@ (rewrite '<= 13 "C_less_or_equal_p" #t) (rewrite 'exact->inexact 13 "C_exact_to_inexact" #t) -(rewrite '##sys#exact->inexact 13 "C_exact_to_inexact" #t) (rewrite 'string->number 13 "C_string_to_number" #t) (rewrite 'number->string 13 "C_number_to_string" #t) (rewrite '##sys#call-with-current-continuation 13 "C_call_cc" #t) diff --git a/library.scm b/library.scm index fed10809..33b204fa 100644 --- a/library.scm +++ b/library.scm @@ -913,9 +913,11 @@ EOF ((< n 0) (if (##sys#exact? n) -1 -1.0)) (else (if (##sys#exact? n) 0 0.0) ) ) ) +;; hooks for numbers (define ##sys#exact->inexact (##core#primitive "C_exact_to_inexact")) -(define exact->inexact ##sys#exact->inexact) (define (##sys#inexact->exact n) (##core#inline "C_i_inexact_to_exact" n)) + +(define exact->inexact ##sys#exact->inexact) (define inexact->exact ##sys#inexact->exact) (define (floor x) diff --git a/srfi-18.scm b/srfi-18.scm index 9fcd5497..35f137c2 100644 --- a/srfi-18.scm +++ b/srfi-18.scm @@ -45,12 +45,19 @@ ;;; Helper routines: +(define-inline (exactify n) + (if (##sys#immediate? x) + n + (##core#inline "C_i_inexact_to_exact" n))) + (define ##sys#compute-time-limit (let ([truncate truncate]) (lambda (tm) (and tm (cond [(##sys#structure? tm 'time) (##sys#slot tm 1)] - [(number? tm) (fx+ (##sys#fudge 16) (inexact->exact (truncate (* tm 1000))))] + [(number? tm) + (fx+ (##sys#fudge 16) + (exactify (truncate (* tm 1000))))] [else (##sys#signal-hook #:type-error "invalid timeout argument" tm)] ) ) ) ) ) @@ -73,7 +80,7 @@ EOF [ms C_ms] ) (##sys#make-structure 'time - (inexact->exact (truncate (+ (* (- s ss) 1000) C_ms))) + (exactify (truncate (+ (* (- s ss) 1000) C_ms))) s C_ms) ) ) @@ -85,7 +92,7 @@ EOF (define (time->milliseconds tm) (##sys#check-structure tm 'time 'time->milliseconds) - (+ (inexact->exact (* (- (##sys#slot tm 2) C_startup_time_seconds) 1000)) + (+ (exactify (* (- (##sys#slot tm 2) C_startup_time_seconds) 1000)) (##sys#slot tm 3) ) ) (define (seconds->time n) @@ -94,8 +101,8 @@ EOF [ms (truncate (* 1000 (##sys#flonum-fraction (##sys#exact->inexact n))))] ; milliseconds - [n3 (inexact->exact (truncate (+ (* n2 1000) ms)))] ) ; milliseconds since startup - (##sys#make-structure 'time n3 (truncate n) (inexact->exact ms)) ) ) + [n3 (exactify (truncate (+ (* n2 1000) ms)))] ) ; milliseconds since startup + (##sys#make-structure 'time n3 (truncate n) (exactify ms)) ) ) (define (milliseconds->time nms) (##sys#check-exact nms 'milliseconds->time) diff --git a/srfi-69.scm b/srfi-69.scm index 5225eab9..5398de66 100644 --- a/srfi-69.scm +++ b/srfi-69.scm @@ -607,8 +607,8 @@ [min-load (##sys#slot ht 5)] [max-load (##sys#slot ht 6)] ) (let ([len (##sys#size vec)] ) - (let ([min-load-len (inexact->exact (floor (* len min-load)))] - [max-load-len (inexact->exact (floor (* len max-load)))] ) + (let ([min-load-len (exactify (floor (* len min-load)))] + [max-load-len (exactify (floor (* len max-load)))] ) (if (and (fx< len hash-table-max-length) (fx<= min-load-len newsiz) (fx<= newsiz max-load-len)) (hash-table-resize! ht vec len) ) ) ) ) )Trap