diff -up src/sage/libs/ecl.pyx.orig src/sage/libs/ecl.pyx --- src/sage/libs/ecl.pyx.orig 2018-12-22 16:37:08.000000000 -0700 +++ src/sage/libs/ecl.pyx 2019-01-17 10:00:52.554236288 -0700 @@ -16,7 +16,7 @@ from __future__ import print_function, a #adapted to work with pure Python types. from libc.stdlib cimport abort -from libc.signal cimport SIGINT, SIGBUS, SIGSEGV, SIGCHLD +from libc.signal cimport SIGINT, SIGBUS, SIGSEGV, SIGCHLD, SIGFPE from libc.signal cimport raise_ as signal_raise from posix.signal cimport sigaction, sigaction_t cimport cysignals.signals @@ -48,9 +48,14 @@ cdef extern from "eclsig.h": void ecl_sig_off() cdef sigaction_t ecl_sigint_handler cdef sigaction_t ecl_sigbus_handler + cdef sigaction_t ecl_sigfpe_handler cdef sigaction_t ecl_sigsegv_handler cdef mpz_t ecl_mpz_from_bignum(cl_object obj) cdef cl_object ecl_bignum_from_mpz(mpz_t num) + cdef int fegetexcept() + cdef int feenableexcept(int) + cdef int fedisableexcept(int) + cdef int ecl_feflags cdef cl_object string_to_object(char * s): return ecl_read_from_cstring(s) @@ -239,6 +244,7 @@ def init_ecl(): global ecl_has_booted cdef char *argv[1] cdef sigaction_t sage_action[32] + cdef int sage_fpes cdef int i if ecl_has_booted: @@ -258,6 +264,8 @@ def init_ecl(): for i in range(1,32): sigaction(i, NULL, &sage_action[i]) + sage_fpes = fegetexcept() + #initialize ECL ecl_set_option(ECL_OPT_SIGNAL_HANDLING_THREAD, 0) cl_boot(1, argv) @@ -265,8 +273,12 @@ def init_ecl(): #save signal handler from ECL sigaction(SIGINT, NULL, &ecl_sigint_handler) sigaction(SIGBUS, NULL, &ecl_sigbus_handler) + sigaction(SIGFPE, NULL, &ecl_sigfpe_handler) sigaction(SIGSEGV, NULL, &ecl_sigsegv_handler) + #save ECL's floating point exception flags + ecl_feflags = fegetexcept() + #verify that no SIGCHLD handler was installed cdef sigaction_t sig_test sigaction(SIGCHLD, NULL, &sig_test) @@ -277,6 +289,9 @@ def init_ecl(): for i in range(1,32): sigaction(i, &sage_action[i], NULL) + fedisableexcept(ecl_feflags) + feenableexcept(sage_fpes) + #initialise list of objects and bind to global variable # *SAGE-LIST-OF-OBJECTS* to make it rooted in the reachable tree for the GC list_of_objects=cl_cons(Cnil,cl_cons(Cnil,Cnil)) diff -up src/sage/libs/eclsig.h.orig src/sage/libs/eclsig.h --- src/sage/libs/eclsig.h.orig 2018-12-22 16:37:08.000000000 -0700 +++ src/sage/libs/eclsig.h 2019-01-17 10:07:23.060570460 -0700 @@ -9,25 +9,59 @@ #include + +/* Rummage around to determine how ECL was configured */ +#define ECL_AVOID_FPE_H /* Prevent some local includes */ +#include + +#ifdef HAVE_FENV_H +#include +#ifndef FE_ALL_EXCEPT +#define FE_ALL_EXCEPT FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW | FE_INVALID +#endif +#else +#ifndef FE_ALL_EXCEPT +#define FE_ALL_EXCEPT 0 +#endif +#endif + +#ifndef HAVE_FEENABLEEXCEPT +/* These are GNU extensions */ +#define fegetexcept() 0 +#define feenablexcept(flags) +#define fdisableexcept(flags) +#endif + static struct sigaction ecl_sigint_handler; static struct sigaction ecl_sigbus_handler; +static struct sigaction ecl_sigfpe_handler; static struct sigaction ecl_sigsegv_handler; static struct sigaction sage_sigint_handler; static struct sigaction sage_sigbus_handler; +static struct sigaction sage_sigfpe_handler; static struct sigaction sage_sigsegv_handler; +static int ecl_feflags; +static int sage_feflags; static inline void set_ecl_signal_handler(void) { sigaction(SIGINT, &ecl_sigint_handler, &sage_sigint_handler); sigaction(SIGBUS, &ecl_sigbus_handler, &sage_sigbus_handler); + sigaction(SIGFPE, &ecl_sigfpe_handler, &sage_sigfpe_handler); sigaction(SIGSEGV, &ecl_sigsegv_handler, &sage_sigsegv_handler); + /* sage_feflags should be 0; we don't set them otherwise */ + sage_feflags = fedisableexcept(FE_ALL_EXCEPT); + feenableexcept(ecl_feflags); } static inline void unset_ecl_signal_handler(void) { sigaction(SIGINT, &sage_sigint_handler, NULL); sigaction(SIGBUS, &sage_sigbus_handler, NULL); + sigaction(SIGFPE, &sage_sigfpe_handler, NULL); sigaction(SIGSEGV, &sage_sigsegv_handler, NULL); + ecl_feflags = fedisableexcept(FE_ALL_EXCEPT); + feenableexcept(sage_feflags); } /* This MUST be a macro because sig_on() must be in the same diff -up src/sage/libs/mpmath/ext_impl.pyx.orig src/sage/libs/mpmath/ext_impl.pyx --- src/sage/libs/mpmath/ext_impl.pyx.orig 2018-12-22 16:37:08.000000000 -0700 +++ src/sage/libs/mpmath/ext_impl.pyx 2019-01-17 09:53:24.350937873 -0700 @@ -164,9 +164,9 @@ opts_double_precision.rounding = ROUND_N opts_mini_prec.prec = 5 opts_mini_prec.rounding = ROUND_D -cdef double _double_inf = float("1e300") * float("1e300") -cdef double _double_ninf = -_double_inf -cdef double _double_nan = _double_inf - _double_inf +cdef double _double_inf = float("inf") +cdef double _double_ninf = float("-inf") +cdef double _double_nan = float("nan") cdef inline void MPF_init(MPF *x): """Allocate space and set value to zero.