~ chicken-core (chicken-5) 02e278cd174810aa28bfc027588d0117ba9295e1
commit 02e278cd174810aa28bfc027588d0117ba9295e1
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Tue Jun 15 14:22:38 2010 +0200
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Tue Jun 15 14:22:38 2010 +0200
srfi-4 tweaks, C_a_i_... macro for faster unsafe exact->inexact
diff --git a/chicken.h b/chicken.h
index 2ca22927..0d1f4a66 100644
--- a/chicken.h
+++ b/chicken.h
@@ -1190,6 +1190,7 @@ extern double trunc(double);
#define C_a_i_flonum(ptr, i, n) C_flonum(ptr, n)
#define C_a_i_data_mpointer(ptr, n, x) C_mpointer(ptr, C_data_pointer(x))
+#define C_a_i_fix_to_flo(p, n, f) C_flonum(p, C_unfix(f))
#define C_a_i_mpointer(ptr, n, x) C_mpointer(ptr, (x))
#define C_a_u_i_pointer_inc(ptr, n, p, i) C_mpointer(ptr, (C_char *)(p) + C_unfix(i))
#define C_pointer_eqp(x, y) C_mk_bool(C_c_pointer_nn(x) == C_c_pointer_nn(y))
diff --git a/library.scm b/library.scm
index 1a8514ab..fed10809 100644
--- a/library.scm
+++ b/library.scm
@@ -966,7 +966,7 @@ EOF
(define max)
(define min)
-(let ([> >]
+(let ([> >] ;XXX could use faster versions
[< <] )
(letrec ([maxmin
(lambda (n1 ns pred)
@@ -978,7 +978,7 @@ EOF
(if (and (##core#inline "C_blockp" nbest)
(##core#inline "C_flonump" nbest)
(not (##core#inline "C_blockp" ni)) )
- (exact->inexact ni)
+ (##core#inline_allocate ("C_a_i_fix_to_flo" 4) ni)
ni)
nbest)
(##sys#slot ns 1) ) ) ) ) ) ] )
@@ -4541,9 +4541,10 @@ EOF
(define setter ##sys#setter)
(define (getter-with-setter get set #!optional info)
- (let ((getdec (if info
- (##sys#make-lambda-info info)
- (##sys#lambda-info get)))
+ (let ((getdec (cond (info
+ (##sys#check-string info 'getter-with-setter)
+ (##sys#make-lambda-info info))
+ (else (##sys#lambda-info get))))
(p1 (##sys#decorate-lambda
get
setter?
diff --git a/srfi-18.scm b/srfi-18.scm
index 2c247641..9fcd5497 100644
--- a/srfi-18.scm
+++ b/srfi-18.scm
@@ -91,7 +91,9 @@ EOF
(define (seconds->time n)
(##sys#check-number n 'seconds->time)
(let* ([n2 (max 0 (- n C_startup_time_seconds))] ; seconds since startup
- [ms (truncate (* 1000 (##sys#flonum-fraction (##sys#exact->inexact n))))] ; milliseconds
+ [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)) ) )
diff --git a/srfi-4.scm b/srfi-4.scm
index c60c3983..0b09c162 100644
--- a/srfi-4.scm
+++ b/srfi-4.scm
@@ -50,7 +50,7 @@ EOF
(##core#inline "C_fixnum_greaterp" n to) )
(##sys#error loc "numeric value is not in expected range" n from to) ) ) )
-(define-inline (check-range i from to)
+(define-inline (check-range i from to loc)
(##sys#check-exact i loc)
(unless (and (fx<= from i) (fx< i to))
(##sys#error-hook
@@ -157,7 +157,7 @@ EOF
x i
(if (##core#inline "C_blockp" y)
y
- (##sys#exact->inexact y))))) ;XXX use faster unsafe variant
+ (##core#inline_allocate ("C_a_i_fix_to_flo" 4) y)))))
(define (f64vector-set! x i y)
(##sys#check-structure x 'f64vector 'f64vector-set!)
@@ -169,7 +169,7 @@ EOF
x i
(if (##core#inline "C_blockp" y)
y
- (##sys#exact->inexact y))))) ;XXX as above
+ (##core#inline_allocate ("C_a_i_fix_to_flo" 4) y)))))
(define u8vector-ref
(getter-with-setter
@@ -370,7 +370,7 @@ EOF
(begin
(##sys#check-number init 'make-f32vector)
(unless (##core#inline "C_blockp" init)
- (set! init (exact->inexact init)) )
+ (set! init (##core#inline_allocate ("C_a_i_fix_to_flo" 4) init)) )
(do ((i 0 (##core#inline "C_fixnum_plus" i 1)))
((##core#inline "C_fixnum_greater_or_equal_p" i len) v)
(##sys#f32vector-set! v i init) ) ) ) ) ) )
@@ -387,7 +387,7 @@ EOF
(begin
(##sys#check-number init 'make-f64vector)
(unless (##core#inline "C_blockp" init)
- (set! init (exact->inexact init)) )
+ (set! init (##core#inline_allocate ("C_a_i_fix_to_flo" 4) init)) )
(do ((i 0 (##core#inline "C_fixnum_plus" i 1)))
((##core#inline "C_fixnum_greater_or_equal_p" i len) v)
(##core#inline "C_u_i_f64vector_set" v i init) ) ) ) ) ) ) )
Trap