summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Python/Makefile.in3
-rw-r--r--Python/bltinmodule.c2
-rw-r--r--Python/compile.c11
-rw-r--r--Python/marshal.c10
-rw-r--r--Python/pyfpe.c16
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