Change PyFPE_END_PROTECT to PyFPE_END_PROTECT(v). v should be the
last variable to which a floating point expression is assigned. The macro passes its address to a dummy function so that the optimizer can't delay calculating its value until after the macro.
This commit is contained in:
parent
efd3a3a843
commit
1f06beeedd
|
@ -131,7 +131,7 @@ extern "C" {
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
extern jmp_buf PyFPE_jbuf;
|
extern jmp_buf PyFPE_jbuf;
|
||||||
extern int PyFPE_counter;
|
extern int PyFPE_counter;
|
||||||
extern double PyFPE_dummy(void);
|
extern double PyFPE_dummy();
|
||||||
|
|
||||||
#define PyFPE_START_PROTECT(err_string, leave_stmt) \
|
#define PyFPE_START_PROTECT(err_string, leave_stmt) \
|
||||||
if (!PyFPE_counter++ && setjmp(PyFPE_jbuf)) { \
|
if (!PyFPE_counter++ && setjmp(PyFPE_jbuf)) { \
|
||||||
|
@ -149,12 +149,12 @@ if (!PyFPE_counter++ && setjmp(PyFPE_jbuf)) { \
|
||||||
* which counts down PyFPE_counter, and thereby monkey wrench the overeager
|
* which counts down PyFPE_counter, and thereby monkey wrench the overeager
|
||||||
* optimizer. Better solutions are welcomed....
|
* optimizer. Better solutions are welcomed....
|
||||||
*/
|
*/
|
||||||
#define PyFPE_END_PROTECT PyFPE_counter -= (int)PyFPE_dummy();
|
#define PyFPE_END_PROTECT(v) PyFPE_counter -= (int)PyFPE_dummy(&(v));
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define PyFPE_START_PROTECT(err_string, leave_stmt)
|
#define PyFPE_START_PROTECT(err_string, leave_stmt)
|
||||||
#define PyFPE_END_PROTECT
|
#define PyFPE_END_PROTECT(v)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue