~ chicken-core (chicken-5) 7df0ae11d7ea5e21f7e18832a57e53a0d844c1e9


commit 7df0ae11d7ea5e21f7e18832a57e53a0d844c1e9
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Sat Jun 25 13:37:28 2011 +0200
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Sat Jun 25 13:37:28 2011 +0200

    allow unboxing fx/?; factored out div-by-zero generation and moved some fixnum and flonum operations into chicken.h

diff --git a/chicken.h b/chicken.h
index 2f5f0474..21d68ce3 100644
--- a/chicken.h
+++ b/chicken.h
@@ -1555,6 +1555,7 @@ C_fctexport void C_bad_min_argc_2(int c, int n, C_word closure) C_noret;
 C_fctexport void C_stack_overflow(void) C_noret;
 C_fctexport void C_unbound_error(C_word sym) C_noret;
 C_fctexport void C_no_closure_error(C_word x) C_noret;
+C_fctexport void C_div_by_zero_error(char *loc) C_noret;
 C_fctexport C_word C_closure(C_word **ptr, int cells, C_word proc, ...);
 C_fctexport C_word C_fcall C_pair(C_word **ptr, C_word car, C_word cdr) C_regparm;
 C_fctexport C_word C_fcall C_h_pair(C_word car, C_word cdr) C_regparm;
@@ -1769,9 +1770,6 @@ C_fctexport C_word C_fcall C_i_not_pair_p_2(C_word x) C_regparm;
 C_fctexport C_word C_fcall C_i_null_list_p(C_word x) C_regparm;
 C_fctexport C_word C_fcall C_i_string_null_p(C_word x) C_regparm;
 C_fctexport C_word C_fcall C_i_null_pointerp(C_word x) C_regparm;
-C_fctexport C_word C_fcall C_i_fixnum_arithmetic_shift(C_word n, C_word c) C_regparm;
-C_fctexport C_word C_fcall C_fixnum_divide(C_word x, C_word y) C_regparm;
-C_fctexport C_word C_fcall C_fixnum_modulo(C_word x, C_word y) C_regparm;
 C_fctexport C_word C_fcall C_i_locative_set(C_word loc, C_word x) C_regparm;
 C_fctexport C_word C_fcall C_i_locative_to_object(C_word loc) C_regparm;
 C_fctexport C_word C_fcall C_a_i_make_locative(C_word **a, int c, C_word type, C_word object, C_word index, C_word weak) C_regparm;
@@ -1799,7 +1797,6 @@ C_fctexport C_word C_fcall C_i_o_fixnum_and(C_word x, C_word y) C_regparm;
 C_fctexport C_word C_fcall C_i_o_fixnum_ior(C_word x, C_word y) C_regparm;
 C_fctexport C_word C_fcall C_i_o_fixnum_xor(C_word x, C_word y) C_regparm;
 C_fctexport C_word C_fcall C_a_i_flonum_round_proper(C_word **a, int c, C_word n) C_regparm;
-C_fctexport C_word C_fcall C_a_i_flonum_quotient_checked(C_word **ptr, int c, C_word n1, C_word n2) C_regparm;
 C_fctexport C_word C_fcall C_i_getprop(C_word sym, C_word prop, C_word def) C_regparm;
 C_fctexport C_word C_fcall C_putprop(C_word **a, C_word sym, C_word prop, C_word val) C_regparm;
 C_fctexport C_word C_fcall C_i_get_keyword(C_word key, C_word args, C_word def) C_regparm;
@@ -2196,6 +2193,27 @@ C_inline C_word C_i_fixnum_max(C_word x, C_word y)
 }
 
 
+C_inline C_word C_fixnum_divide(C_word x, C_word y)
+{
+  if(y == C_fix(0)) C_div_by_zero_error("fx/");
+  else return C_u_fixnum_divide(x, y);
+}
+
+
+C_inline C_word C_fixnum_modulo(C_word x, C_word y)
+{
+  if(y == C_fix(0)) C_div_by_zero_error("fxmod");
+  else return C_u_fixnum_modulo(x, y);
+}
+
+
+C_inline C_word C_i_fixnum_arithmetic_shift(C_word n, C_word c)
+{
+  if(C_unfix(c) < 0) return C_fixnum_shift_right(n, C_u_fixnum_negate(c));
+  else return C_fixnum_shift_left(n, c);
+}
+
+
 C_inline C_word C_i_flonum_min(C_word x, C_word y)
 {
   double 
@@ -2216,6 +2234,24 @@ C_inline C_word C_i_flonum_max(C_word x, C_word y)
 }
 
 
+C_inline C_word
+C_a_i_flonum_quotient_checked(C_word **ptr, int c, C_word n1, C_word n2)
+{
+  double n3 = C_flonum_magnitude(n2);
+
+  if(n3 == 0.0) C_div_by_zero_error("fp/?");
+  else return C_flonum(ptr, C_flonum_magnitude(n1) / n3);
+}
+
+
+C_inline double
+C_ub_i_flonum_quotient_checked(double n1, double n2)
+{
+  if(n2 == 0.0) C_div_by_zero_error("fp/?");
+  else return n1 / n2;
+}
+
+
 C_inline C_word C_i_safe_pointerp(C_word x)
 {
   if(C_immediatep(x)) return C_SCHEME_FALSE;
diff --git a/runtime.c b/runtime.c
index 9a45a44b..afc43a22 100644
--- a/runtime.c
+++ b/runtime.c
@@ -2242,6 +2242,12 @@ void C_no_closure_error(C_word x)
 }
 
 
+void C_div_by_zero_error(char *loc)
+{
+  barf(C_DIVISION_BY_ZERO_ERROR, loc);
+}
+
+
 /* Allocate and initialize record: */
 
 C_regparm C_word C_fcall C_string(C_word **ptr, int len, C_char *str)
@@ -5313,30 +5319,6 @@ C_regparm C_word C_fcall C_a_i_sqrt(C_word **a, int c, C_word n)
 }
 
 
-/* I */
-C_regparm C_word C_fcall C_i_fixnum_arithmetic_shift(C_word n, C_word c)
-{
-  if(C_unfix(c) < 0) return C_fixnum_shift_right(n, C_u_fixnum_negate(c));
-  else return C_fixnum_shift_left(n, c);
-}
-
-
-/* I */
-C_regparm C_word C_fcall C_fixnum_divide(C_word x, C_word y)
-{
-  if(y == C_fix(0)) barf(C_DIVISION_BY_ZERO_ERROR, "fx/");
-  else return C_u_fixnum_divide(x, y);
-}
-
-
-/* I */
-C_regparm C_word C_fcall C_fixnum_modulo(C_word x, C_word y)
-{
-  if(y == C_fix(0)) barf(C_DIVISION_BY_ZERO_ERROR, "fxmod");
-  else return C_u_fixnum_modulo(x, y);
-}
-
-
 C_regparm C_word C_fcall C_i_assq(C_word x, C_word lst)
 {
   C_word a;
@@ -9299,13 +9281,3 @@ C_filter_heap_objects(C_word c, C_word closure, C_word k, C_word func, C_word ve
   C_fromspace_top = C_fromspace_limit; /* force major GC */
   C_reclaim((void *)filter_heap_objects_2, NULL);
 }
-
-
-C_regparm C_word C_fcall 
-C_a_i_flonum_quotient_checked(C_word **ptr, int c, C_word n1, C_word n2)
-{
-  double n3 = C_flonum_magnitude(n2);
-
-  if(n3 == 0.0) barf(C_DIVISION_BY_ZERO_ERROR, "fp/?");
-  else return C_flonum(ptr, C_flonum_magnitude(n1) / n3);
-}
diff --git a/unboxing.scm b/unboxing.scm
index 174ede5d..83221d25 100644
--- a/unboxing.scm
+++ b/unboxing.scm
@@ -532,6 +532,7 @@
   (C_a_i_flonum_difference (flonum flonum) flonum "C_ub_i_flonum_difference")
   (C_a_i_flonum_times (flonum flonum) flonum "C_ub_i_flonum_times") 
   (C_a_i_flonum_quotient (flonum flonum) flonum "C_ub_i_flonum_quotient") 
+  (C_a_i_flonum_quotient_checked (flonum flonum) flonum "C_ub_i_flonum_quotient_checked") 
   (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")
Trap