diff options
Diffstat (limited to 'libguile')
-rw-r--r-- | libguile/foreign.c | 8 | ||||
-rw-r--r-- | libguile/numbers.c | 29 | ||||
-rw-r--r-- | libguile/print.c | 3 |
3 files changed, 32 insertions, 8 deletions
diff --git a/libguile/foreign.c b/libguile/foreign.c index db8e13127..76e43f3ad 100644 --- a/libguile/foreign.c +++ b/libguile/foreign.c @@ -329,9 +329,15 @@ SCM_DEFINE (scm_dereference_pointer, "dereference-pointer", 1, 0, 0, "holds a pointer, return this pointer.") #define FUNC_NAME s_scm_dereference_pointer { + void **ptr; + SCM_VALIDATE_POINTER (1, pointer); - return scm_from_pointer (* (void **) SCM_POINTER_VALUE (pointer), NULL); + ptr = SCM_POINTER_VALUE (pointer); + if (SCM_UNLIKELY (ptr == NULL)) + null_pointer_error (FUNC_NAME); + + return scm_from_pointer (*ptr, NULL); } #undef FUNC_NAME diff --git a/libguile/numbers.c b/libguile/numbers.c index 3cdc7fd16..b5bce2308 100644 --- a/libguile/numbers.c +++ b/libguile/numbers.c @@ -48,6 +48,7 @@ #endif #include <verify.h> +#include <assert.h> #include <math.h> #include <string.h> @@ -5004,7 +5005,7 @@ left_shift_exact_integer (SCM n, long count) return result; } else - scm_syserror ("left_shift_exact_integer"); + assert (0); } /* Efficiently compute floor (N / 2^COUNT), @@ -5030,7 +5031,7 @@ floor_right_shift_exact_integer (SCM n, long count) return scm_i_normbig (result); } else - scm_syserror ("floor_right_shift_exact_integer"); + assert (0); } /* Efficiently compute round (N / 2^COUNT), @@ -5068,7 +5069,7 @@ round_right_shift_exact_integer (SCM n, long count) return scm_i_normbig (q); } else - scm_syserror ("round_right_shift_exact_integer"); + assert (0); } SCM_DEFINE (scm_ash, "ash", 2, 0, 0, @@ -6199,7 +6200,7 @@ mem2ureal (SCM mem, unsigned int *p_idx, } /* We should never get here */ - scm_syserror ("mem2ureal"); + assert (0); } @@ -9194,7 +9195,15 @@ SCM_PRIMITIVE_GENERIC (scm_numerator, "numerator", 1, 0, 0, else if (SCM_FRACTIONP (z)) return SCM_FRACTION_NUMERATOR (z); else if (SCM_REALP (z)) - return scm_exact_to_inexact (scm_numerator (scm_inexact_to_exact (z))); + { + double zz = SCM_REAL_VALUE (z); + if (zz == floor (zz)) + /* Handle -0.0 and infinities in accordance with R6RS + flnumerator, and optimize handling of integers. */ + return z; + else + return scm_exact_to_inexact (scm_numerator (scm_inexact_to_exact (z))); + } else return scm_wta_dispatch_1 (g_scm_numerator, z, SCM_ARG1, s_scm_numerator); } @@ -9211,7 +9220,15 @@ SCM_PRIMITIVE_GENERIC (scm_denominator, "denominator", 1, 0, 0, else if (SCM_FRACTIONP (z)) return SCM_FRACTION_DENOMINATOR (z); else if (SCM_REALP (z)) - return scm_exact_to_inexact (scm_denominator (scm_inexact_to_exact (z))); + { + double zz = SCM_REAL_VALUE (z); + if (zz == floor (zz)) + /* Handle infinities in accordance with R6RS fldenominator, and + optimize handling of integers. */ + return scm_i_from_double (1.0); + else + return scm_exact_to_inexact (scm_denominator (scm_inexact_to_exact (z))); + } else return scm_wta_dispatch_1 (g_scm_denominator, z, SCM_ARG1, s_scm_denominator); diff --git a/libguile/print.c b/libguile/print.c index 50f5a3e68..dbc6e96ed 100644 --- a/libguile/print.c +++ b/libguile/print.c @@ -448,7 +448,8 @@ print_extended_symbol (SCM sym, SCM port) SUBSEQUENT_IDENTIFIER_MASK | UC_CATEGORY_MASK_Zs)) { - if (!display_character (c, port, strategy)) + if (!display_character (c, port, strategy) + || (c == '\\' && !display_character (c, port, strategy))) scm_encoding_error ("print_extended_symbol", errno, "cannot convert to output locale", port, SCM_MAKE_CHAR (c)); |