diff options
author | Antonio Rojas | 2020-06-22 00:06:09 +0200 |
---|---|---|
committer | Antonio Rojas | 2020-06-22 00:06:09 +0200 |
commit | 28216922114c2ae8d5ad1db453d80cbbef8c402d (patch) | |
tree | 56dc23b4a375b34f824c4408c2f0a74aac33653e /sagemath-ecl-sigfpe.patch | |
parent | 8f19019cad31523757105a58e7604b554407cb54 (diff) | |
download | aur-28216922114c2ae8d5ad1db453d80cbbef8c402d.tar.gz |
Fix build with ECL 20.04
Diffstat (limited to 'sagemath-ecl-sigfpe.patch')
-rw-r--r-- | sagemath-ecl-sigfpe.patch | 147 |
1 files changed, 0 insertions, 147 deletions
diff --git a/sagemath-ecl-sigfpe.patch b/sagemath-ecl-sigfpe.patch deleted file mode 100644 index 44a280d2cd5a..000000000000 --- a/sagemath-ecl-sigfpe.patch +++ /dev/null @@ -1,147 +0,0 @@ -diff --git a/src/sage/libs/ecl.pyx b/src/sage/libs/ecl.pyx -index e408866..fa24ac0 100644 ---- a/src/sage/libs/ecl.pyx -+++ b/src/sage/libs/ecl.pyx -@@ -15,7 +15,7 @@ from __future__ import print_function, absolute_import - #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 -@@ -47,9 +47,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) -@@ -238,6 +243,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: -@@ -257,6 +263,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) -@@ -264,8 +272,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) -@@ -276,6 +288,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)) -@@ -319,7 +334,6 @@ def init_ecl(): - (values nil (princ-to-string cnd))))) - """)) - safe_funcall_clobj=cl_eval(string_to_object(b"(symbol-function 'sage-safe-funcall)")) -- - ecl_has_booted = 1 - - cdef cl_object ecl_safe_eval(cl_object form) except NULL: -diff --git a/src/sage/libs/eclsig.h b/src/sage/libs/eclsig.h -index f9f2690..a7e1f40 100644 ---- a/src/sage/libs/eclsig.h -+++ b/src/sage/libs/eclsig.h -@@ -9,24 +9,66 @@ - - - #include <signal.h> -+ -+/* Rummage around to determine how ECL was configured */ -+#define ECL_AVOID_FPE_H /* Prevent some local includes */ -+#include <ecl/config-internal.h> -+ -+#ifdef HAVE_FENV_H -+#include <fenv.h> -+#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 -+#define feclearexcept(flags) do {} while (0) -+#endif -+ -+#ifndef HAVE_FEENABLEEXCEPT -+/* These are GNU extensions */ -+#define fegetexcept() 0 -+#define feenablexcept(flags) do {} while (0) -+#define fdisableexcept(flags) do {} while (0) -+#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); -+ -+ /* first clear pending floating point exceptions, if any */ -+ feclearexcept(FE_ALL_EXCEPT); -+ -+ /* 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) - { -+ /* clear pending exceptions and restore previous exception mask */ -+ feclearexcept(FE_ALL_EXCEPT); -+ ecl_feflags = fedisableexcept(FE_ALL_EXCEPT); -+ feenableexcept(sage_feflags); -+ - sigaction(SIGINT, &sage_sigint_handler, NULL); - sigaction(SIGBUS, &sage_sigbus_handler, NULL); -+ sigaction(SIGFPE, &sage_sigfpe_handler, NULL); - sigaction(SIGSEGV, &sage_sigsegv_handler, NULL); - } - |