Changes for Lee Busby's SIGFPE patch set.
New file pyfpe.c and exception FloatingPointError. Surround some f.p. operations with PyFPE macro brackets.
This commit is contained in:
parent
09e6ad0c1e
commit
0ae748d3c4
|
@ -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
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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 *
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue