~ chicken-core (chicken-5) f295b2dd1f994b08a40f53c769a3e809b48e5bee


commit f295b2dd1f994b08a40f53c769a3e809b48e5bee
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Thu Dec 24 00:28:13 2009 +0100
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Thu Dec 24 00:28:13 2009 +0100

    added some more unboxed flonum operations

diff --git a/c-platform.scm b/c-platform.scm
index 19781b8e..915137dc 100644
--- a/c-platform.scm
+++ b/c-platform.scm
@@ -146,7 +146,7 @@
     f32vector-ref f64vector-ref f32vector-set! f64vector-set!
     u8vector-set! s8vector-set! u16vector-set! s16vector-set! u32vector-set! s32vector-set!
     locative-ref locative-set! locative->object locative? global-ref
-    null-pointer? pointer->object flonum? finite?
+    null-pointer? pointer->object flonum? finite? address->pointer pointer->address
     printf sprintf format) )
 
 (define internal-bindings
@@ -180,6 +180,7 @@
     u8vector->blob/shared s8vector->blob/shared u16vector->blob/shared s16vector->blob/shared u32vector->blob/shared
     f32vector->blob/shared f64vector->blob/shared
     s32vector->blob/shared read-string read-string! o
+    address->pointer pointer->address
     ##sys#make-structure print* ##sys#make-vector ##sys#apply ##sys#setislot ##sys#block-ref
     ##sys#byte ##sys#setbyte 
     u8vector-length s8vector-length u16vector-length s16vector-length u32vector-length s32vector-length
@@ -571,6 +572,7 @@
 (rewrite 'finite? 2 1 "C_i_finitep" #f)
 (rewrite 'fpinteger? 2 1 "C_u_i_fpintegerp" #f)
 (rewrite '##sys#pointer? 2 1 "C_anypointerp" #t)
+(rewrite 'pointer? 2 1 "C_i_safe_pointerp" #t)
 (rewrite '##sys#generic-structure? 2 1 "C_structurep" #t)
 (rewrite 'exact? 2 1 "C_fixnump" #f)
 (rewrite 'exact? 2 1 "C_i_exactp" #t)
@@ -604,15 +606,15 @@
 (rewrite 'fx< 2 2 "C_fixnum_lessp" #t)
 (rewrite 'fx>= 2 2 "C_fixnum_greater_or_equal_p" #t)
 (rewrite 'fx<= 2 2 "C_fixnum_less_or_equal_p" #t)
-(rewrite 'fp= 2 2 "C_flonum_equalp" #t)
-(rewrite 'fp> 2 2 "C_flonum_greaterp" #t)
-(rewrite 'fp< 2 2 "C_flonum_lessp" #t)
-(rewrite 'fp>= 2 2 "C_flonum_greater_or_equal_p" #t)
-(rewrite 'fp<= 2 2 "C_flonum_less_or_equal_p" #t)
-(rewrite 'fxmax 2 2 "C_i_fixnum_max" #t)
-(rewrite 'fxmin 2 2 "C_i_fixnum_min" #t)
-(rewrite 'fpmax 2 2 "C_i_flonum_max" #t)
-(rewrite 'fpmin 2 2 "C_i_flonum_min" #t)
+(rewrite 'fp= 2 2 "C_flonum_equalp" #f)
+(rewrite 'fp> 2 2 "C_flonum_greaterp" #f)
+(rewrite 'fp< 2 2 "C_flonum_lessp" #f)
+(rewrite 'fp>= 2 2 "C_flonum_greater_or_equal_p" #f)
+(rewrite 'fp<= 2 2 "C_flonum_less_or_equal_p" #f)
+(rewrite 'fxmax 2 2 "C_i_fixnum_max" #f)
+(rewrite 'fxmin 2 2 "C_i_fixnum_min" #f)
+(rewrite 'fpmax 2 2 "C_i_flonum_max" #f)
+(rewrite 'fpmin 2 2 "C_i_flonum_min" #f)
 (rewrite 'char-numeric? 2 1 "C_u_i_char_numericp" #t)
 (rewrite 'char-alphabetic? 2 1 "C_u_i_char_alphabeticp" #t)
 (rewrite 'char-whitespace? 2 1 "C_u_i_char_whitespacep" #t)
@@ -814,6 +816,8 @@
 (rewrite '##sys#vector 16 #f "C_a_i_vector" #t #t)
 (rewrite '##sys#make-structure 16 #f "C_a_i_record" #t #t)
 (rewrite 'string 16 #f "C_a_i_string" #t #t) ; the last #t is actually too much, but we don't care
+(rewrite 'address->pointer 16 1 "C_a_i_address_to_pointer" #f 2)
+(rewrite 'pointer->address 16 1 "C_a_i_pointer_to_address" #f words-per-flonum)
 
 (rewrite
  '##sys#setslot 8
diff --git a/chicken-install.scm b/chicken-install.scm
index 476e86da..79d55352 100644
--- a/chicken-install.scm
+++ b/chicken-install.scm
@@ -25,8 +25,7 @@
 
 
 (require-library setup-download setup-api)
-(require-library srfi-1 posix data-structures utils regex ports extras
-                 srfi-13 files)
+(require-library srfi-1 posix data-structures utils regex ports extras srfi-13 files)
 (require-library chicken-syntax)	; in case an import library reexports chicken syntax
 
 
@@ -179,7 +178,8 @@
   (define *eggs+dirs+vers* '())
   (define *dependencies* '())
   (define *checked* '())
-  (define *csi* (shellpath (make-pathname *program-path* (foreign-value "C_CSI_PROGRAM" c-string))))
+  (define *csi* 
+    (shellpath (make-pathname *program-path* (foreign-value "C_CSI_PROGRAM" c-string))))
 
   (define (try-extension name version trans locn)
     (condition-case
diff --git a/chicken.h b/chicken.h
index d8941748..7b3b3129 100644
--- a/chicken.h
+++ b/chicken.h
@@ -1060,6 +1060,9 @@ extern double trunc(double);
 #define C_a_i_flonum_quotient(ptr, c, n1, n2) C_flonum(ptr, C_flonum_magnitude(n1) / C_flonum_magnitude(n2))
 #define C_a_i_flonum_negate(ptr, c, n)  C_flonum(ptr, -C_flonum_magnitude(n))
 
+#define C_a_i_address_to_pointer(ptr, c, addr)  C_mpointer(ptr, (void *)C_num_to_unsigned_int(addr))
+#define C_a_i_pointer_to_address(ptr, c, pptr)  C_unsigned_int_to_num(ptr, (unsigned int)pptr)
+
 #define C_display_fixnum(p, n)          (C_fprintf(C_port_file(p), C_text("%d"), C_unfix(n)), C_SCHEME_UNDEFINED)
 #define C_display_char(p, c)            (C_fputc(C_character_code(c), C_port_file(p)), C_SCHEME_UNDEFINED)
 #define C_display_string(p, s)          (C_fwrite(((C_SCHEME_BLOCK *)(s))->data, sizeof(C_char), C_header_size(s), \
@@ -1291,6 +1294,12 @@ extern double trunc(double);
 #define C_ub_i_flonum_times(x, y)       ((x) * (y))
 #define C_ub_i_flonum_quotient(x, y)    ((x) / (y))
 
+#define C_ub_i_flonum_equalp(n1, n2)    ((n1) == (n2))
+#define C_ub_i_flonum_greaterp(n1, n2)  ((n1) > (n2))
+#define C_ub_i_flonum_lessp(n1, n2)     ((n1) < (n2))
+#define C_ub_i_flonum_greater_or_equal_p(n1, n2)  ((n1) >= (n2))
+#define C_ub_i_flonum_less_or_equal_p(n1, n2)  ((n1) <= (n2))
+
 #define C_end_of_main
 
 #if !defined(C_EMBEDDED) && !defined(C_SHARED)
@@ -2002,6 +2011,14 @@ C_inline C_word C_u_i_fpintegerp(C_word x)
 }
 
 
+C_inline int C_ub_i_fpintegerp(double x)
+{
+  double dummy;
+
+  return C_modf(x, &dummy) == 0.0;
+}
+
+
 C_inline C_word C_i_integerp(C_word x)
 {
   double dummy;
@@ -2057,6 +2074,21 @@ C_inline C_word C_i_flonum_max(C_word x, C_word y)
 }
 
 
+C_inline C_word C_i_safe_pointerp(C_word x)
+{
+  if(C_immediatep(x)) return C_SCHEME_FALSE;
+
+  switch(C_block_header(x)) {
+  case C_POINTER_TAG:
+  case C_SWIG_POINTER_TAG:
+  case C_TAGGED_POINTER_TAG:
+    return C_SCHEME_TRUE;
+  }
+
+  return C_SCHEME_FALSE;
+}
+
+
 C_END_C_DECLS
 
 #endif /* ___CHICKEN */
diff --git a/unboxing.scm b/unboxing.scm
index e6975c4e..b563cd53 100644
--- a/unboxing.scm
+++ b/unboxing.scm
@@ -400,7 +400,30 @@
   (C_u_i_f64vector_set (* fixnum flonum) fixnum "C_ub_i_f64vector_set")
   (C_a_i_f32vector_ref (* fixnum) flonum "C_ub_i_f32vector_ref")
   (C_a_i_f64vector_ref (* fixnum) flonum "C_ub_i_f64vector_ref")
-  ; fpinteger?
-  ; finite?
-  ; fp= fp> fp< fp>= fp<=
+  (C_u_i_fpintegerp (flonum) bool "C_ub_i_fpintegerp")
+  (C_flonum_equalp (flonum flonum) bool "C_ub_i_flonum_equalp")
+  (C_flonum_greaterp (flonum flonum) bool "C_ub_i_flonum_greaterp")
+  (C_flonum_lessp (flonum flonum) bool "C_ub_i_flonum_lessp")
+  (C_flonum_greater_or_equal_p (flonum flonum) bool "C_ub_i_flonum_greater_or_equal_p")
+  (C_flonum_less_or_equal_p (flonum flonum) bool "C_ub_i_flonum_less_or_equal_p")
+  ; address->pointer
+  ; pointer->address
+  ; pointer+
+  ; pointer=?
+  ; pointer-u8-ref
+  ; pointer-s8-ref
+  ; pointer-u16-ref
+  ; pointer-s16-ref
+  ; pointer-u32-ref
+  ; pointer-s32-ref
+  ; pointer-f32-ref
+  ; pointer-f64-ref
+  ; pointer-u8-set!
+  ; pointer-s8-set!
+  ; pointer-u16-set!
+  ; pointer-s16-set!
+  ; pointer-u32-set!
+  ; pointer-s32-set!
+  ; pointer-f32-set!
+  ; pointer-f64-set!
   )
Trap