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 \
|
getplatform.o getversion.o graminit.o \
|
||||||
import.o importdl.o \
|
import.o importdl.o \
|
||||||
marshal.o modsupport.o mystrtoul.o \
|
marshal.o modsupport.o mystrtoul.o \
|
||||||
pythonrun.o \
|
pyfpe.o pythonrun.o \
|
||||||
sigcheck.o structmember.o sysmodule.o \
|
sigcheck.o structmember.o sysmodule.o \
|
||||||
traceback.o \
|
traceback.o \
|
||||||
$(LIBOBJS)
|
$(LIBOBJS)
|
||||||
|
@ -107,6 +107,7 @@ marshal.o: marshal.c
|
||||||
memmove.o: memmove.c
|
memmove.o: memmove.c
|
||||||
modsupport.o: modsupport.c
|
modsupport.o: modsupport.c
|
||||||
mystrtoul.o: mystrtoul.c
|
mystrtoul.o: mystrtoul.c
|
||||||
|
pyfpe.o: pyfpe.c
|
||||||
pythonrun.o: pythonrun.c
|
pythonrun.o: pythonrun.c
|
||||||
sigcheck.o: sigcheck.c
|
sigcheck.o: sigcheck.c
|
||||||
strerror.o: strerror.c
|
strerror.o: strerror.c
|
||||||
|
|
|
@ -1621,6 +1621,7 @@ object *AccessError;
|
||||||
object *AttributeError;
|
object *AttributeError;
|
||||||
object *ConflictError;
|
object *ConflictError;
|
||||||
object *EOFError;
|
object *EOFError;
|
||||||
|
object *FloatingPointError;
|
||||||
object *IOError;
|
object *IOError;
|
||||||
object *ImportError;
|
object *ImportError;
|
||||||
object *IndexError;
|
object *IndexError;
|
||||||
|
@ -1654,6 +1655,7 @@ initerrors()
|
||||||
AttributeError = newstdexception("AttributeError");
|
AttributeError = newstdexception("AttributeError");
|
||||||
ConflictError = newstdexception("ConflictError");
|
ConflictError = newstdexception("ConflictError");
|
||||||
EOFError = newstdexception("EOFError");
|
EOFError = newstdexception("EOFError");
|
||||||
|
FloatingPointError = newstdexception("FloatingPointError");
|
||||||
IOError = newstdexception("IOError");
|
IOError = newstdexception("IOError");
|
||||||
ImportError = newstdexception("ImportError");
|
ImportError = newstdexception("ImportError");
|
||||||
IndexError = newstdexception("IndexError");
|
IndexError = newstdexception("IndexError");
|
||||||
|
|
|
@ -782,6 +782,7 @@ parsenumber(co, s)
|
||||||
extern double atof PROTO((const char *));
|
extern double atof PROTO((const char *));
|
||||||
char *end;
|
char *end;
|
||||||
long x;
|
long x;
|
||||||
|
double dx;
|
||||||
#ifndef WITHOUT_COMPLEX
|
#ifndef WITHOUT_COMPLEX
|
||||||
Py_complex c;
|
Py_complex c;
|
||||||
int imflag;
|
int imflag;
|
||||||
|
@ -810,12 +811,18 @@ parsenumber(co, s)
|
||||||
#ifndef WITHOUT_COMPLEX
|
#ifndef WITHOUT_COMPLEX
|
||||||
if (imflag) {
|
if (imflag) {
|
||||||
c.real = 0.;
|
c.real = 0.;
|
||||||
|
PyFPE_START_PROTECT("atof", return 0)
|
||||||
c.imag = atof(s);
|
c.imag = atof(s);
|
||||||
|
PyFPE_END_PROTECT
|
||||||
return newcomplexobject(c);
|
return newcomplexobject(c);
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
#endif
|
#endif
|
||||||
return newfloatobject(atof(s));
|
PyFPE_START_PROTECT("atof", return 0)
|
||||||
|
dx = atof(s);
|
||||||
|
PyFPE_END_PROTECT
|
||||||
|
return newfloatobject(dx);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static object *
|
static object *
|
||||||
|
|
|
@ -412,6 +412,7 @@ r_object(p)
|
||||||
{
|
{
|
||||||
extern double atof PROTO((const char *));
|
extern double atof PROTO((const char *));
|
||||||
char buf[256];
|
char buf[256];
|
||||||
|
double dx;
|
||||||
n = r_byte(p);
|
n = r_byte(p);
|
||||||
if (r_string(buf, (int)n, p) != n) {
|
if (r_string(buf, (int)n, p) != n) {
|
||||||
err_setstr(EOFError,
|
err_setstr(EOFError,
|
||||||
|
@ -419,7 +420,10 @@ r_object(p)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
buf[n] = '\0';
|
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
|
#ifndef WITHOUT_COMPLEX
|
||||||
|
@ -435,7 +439,9 @@ r_object(p)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
buf[n] = '\0';
|
buf[n] = '\0';
|
||||||
|
PyFPE_START_PROTECT("atof", return 0)
|
||||||
c.real = atof(buf);
|
c.real = atof(buf);
|
||||||
|
PyFPE_END_PROTECT
|
||||||
n = r_byte(p);
|
n = r_byte(p);
|
||||||
if (r_string(buf, (int)n, p) != n) {
|
if (r_string(buf, (int)n, p) != n) {
|
||||||
err_setstr(EOFError,
|
err_setstr(EOFError,
|
||||||
|
@ -443,7 +449,9 @@ r_object(p)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
buf[n] = '\0';
|
buf[n] = '\0';
|
||||||
|
PyFPE_START_PROTECT("atof", return 0)
|
||||||
c.imag = atof(buf);
|
c.imag = atof(buf);
|
||||||
|
PyFPE_END_PROTECT
|
||||||
return newcomplexobject(c);
|
return newcomplexobject(c);
|
||||||
}
|
}
|
||||||
#endif
|
#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