Commit cdb602e4 authored by Marius Gerbershagen's avatar Marius Gerbershagen
Browse files

fpe: prevent spurious floating point exceptions in WITH_LISP_FPE

feenableexcept may generate a SIGFPE signal if exception status flags
are not cleared beforehand. Happens for example on powerpc platforms.

Fixes #612.
parent 7f1813cd
......@@ -258,8 +258,7 @@ booting. This macro allows for execution of Lisp code while saving and
later restoring the floating point environment of surrounding C code
so that changes in the floating point environment don't leak outside.
@coderef{ECL_WITH_LISP_FPE} can be also used before ECL has booted or
before an external thread has been imported.
@coderef{ECL_WITH_LISP_FPE} can be also used before ECL has booted.
@exindex Safely executing Lisp code with floating point exceptions in embedding program
@paragraph Example
......
......@@ -75,12 +75,12 @@
# define ECL_WITH_LISP_FPE_BEGIN do { \
fenv_t __fenv; \
fegetenv(&__fenv); \
feclearexcept(FE_ALL_EXCEPT); \
if (ecl_get_option(ECL_OPT_BOOTED) > 0) { \
int bits = ecl_process_env()->trap_fpe_bits; \
fedisableexcept(FE_ALL_EXCEPT & ~bits); \
feenableexcept(FE_ALL_EXCEPT & bits); \
} \
feclearexcept(FE_ALL_EXCEPT);
}
# else
# define ECL_WITH_LISP_FPE_BEGIN do { \
fenv_t __fenv; \
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment