diff options
-rw-r--r-- | Python/Makefile.in | 3 | ||||
-rw-r--r-- | Python/bltinmodule.c | 2 | ||||
-rw-r--r-- | Python/compile.c | 11 | ||||
-rw-r--r-- | Python/marshal.c | 10 | ||||
-rw-r--r-- | Python/pyfpe.c | 16 |
5 files changed, 38 insertions, 4 deletions
diff --git a/Python/Makefile.in b/Python/Makefile.in index 5be2532..e8cc39f 100644 --- a/Python/Makefile.in +++ b/Python/Makefile.in @@ -41,7 +41,7 @@ OBJS= \ getplatform.o getversion.o graminit.o \ import.o importdl.o \ marshal.o modsupport.o mystrtoul.o \ - pythonrun.o \ + pyfpe.o pythonrun.o \ sigcheck.o structmember.o sysmodule.o \ traceback.o \ $(LIBOBJS) @@ -107,6 +107,7 @@ marshal.o: marshal.c memmove.o: memmove.c modsupport.o: modsupport.c mystrtoul.o: mystrtoul.c +pyfpe.o: pyfpe.c pythonrun.o: pythonrun.c sigcheck.o: sigcheck.c strerror.o: strerror.c diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index d1dc9a5..29e3393 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -1621,6 +1621,7 @@ object *AccessError; object *AttributeError; object *ConflictError; object *EOFError; +object *FloatingPointError; object *IOError; object *ImportError; object *IndexError; @@ -1654,6 +1655,7 @@ initerrors() AttributeError = newstdexception("AttributeError"); ConflictError = newstdexception("ConflictError"); EOFError = newstdexception("EOFError"); + FloatingPointError = newstdexception("FloatingPointError"); IOError = newstdexception("IOError"); ImportError = newstdexception("ImportError"); IndexError = newstdexception("IndexError"); diff --git a/Python/compile.c b/Python/compile.c index e06f345..0ee5519 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -782,6 +782,7 @@ parsenumber(co, s) extern double atof PROTO((const char *)); char *end; long x; + double dx; #ifndef WITHOUT_COMPLEX Py_complex c; int imflag; @@ -810,12 +811,18 @@ parsenumber(co, s) #ifndef WITHOUT_COMPLEX if (imflag) { c.real = 0.; + PyFPE_START_PROTECT("atof", return 0) c.imag = atof(s); + PyFPE_END_PROTECT return newcomplexobject(c); } - else + else { #endif - return newfloatobject(atof(s)); + PyFPE_START_PROTECT("atof", return 0) + dx = atof(s); + PyFPE_END_PROTECT + return newfloatobject(dx); + } } static object * diff --git a/Python/marshal.c b/Python/marshal.c index 0ad493a..f4634f0 100644 --- a/Python/marshal.c +++ b/Python/marshal.c @@ -412,6 +412,7 @@ r_object(p) { extern double atof PROTO((const char *)); char buf[256]; + double dx; n = r_byte(p); if (r_string(buf, (int)n, p) != n) { err_setstr(EOFError, @@ -419,7 +420,10 @@ r_object(p) return NULL; } buf[n] = '\0'; - return newfloatobject(atof(buf)); + PyFPE_START_PROTECT("atof", return 0) + dx = atof(buf); + PyFPE_END_PROTECT + return newfloatobject(dx); } #ifndef WITHOUT_COMPLEX @@ -435,7 +439,9 @@ r_object(p) return NULL; } buf[n] = '\0'; + PyFPE_START_PROTECT("atof", return 0) c.real = atof(buf); + PyFPE_END_PROTECT n = r_byte(p); if (r_string(buf, (int)n, p) != n) { err_setstr(EOFError, @@ -443,7 +449,9 @@ r_object(p) return NULL; } buf[n] = '\0'; + PyFPE_START_PROTECT("atof", return 0) c.imag = atof(buf); + PyFPE_END_PROTECT return newcomplexobject(c); } #endif diff --git a/Python/pyfpe.c b/Python/pyfpe.c new file mode 100644 index 0000000..0b38997 --- /dev/null +++ b/Python/pyfpe.c @@ -0,0 +1,16 @@ +#include "config.h" +#include "pyfpe.h" + +/* + * The signal handler for SIGFPE is actually declared in an external + * module fpectl, or as preferred by the user. These variable + * definitions are required in order to compile Python without + * getting missing externals, but to actually handle SIGFPE requires + * defining a handler and enabling generation of SIGFPE. + */ + +#ifdef WANT_SIGFPE_HANDLER +jmp_buf PyFPE_jbuf; +int PyFPE_counter = 0; +double PyFPE_dummy(void){return(1.0);} +#endif |