Kaydet (Commit) 05bc4af4 authored tarafından Guido van Rossum's avatar Guido van Rossum

Lee's next version. Careful: this now dumps core for me on SGI IRIX 5.3.

Lee is wondering whether to withdraw his patchs.  Sigh.
üst ad183bbf
...@@ -46,11 +46,12 @@ ...@@ -46,11 +46,12 @@
static PyObject *fpe_error; static PyObject *fpe_error;
void initfpetest(void); void initfpetest(void);
static PyObject *test(PyObject *self,PyObject *args); static PyObject *test(PyObject *self,PyObject *args);
static int db0(void); static double db0(double);
static int overflow(void); static double overflow(double);
static int nest1(double); static double nest1(int, double);
static int nest2(double); static double nest2(int, double);
static double nest3(double); static double nest3(double);
static void printerr(double);
static PyMethodDef fpetest_methods[] = { static PyMethodDef fpetest_methods[] = {
{"test", (PyCFunction) test, 1}, {"test", (PyCFunction) test, 1},
...@@ -59,159 +60,116 @@ static PyMethodDef fpetest_methods[] = { ...@@ -59,159 +60,116 @@ static PyMethodDef fpetest_methods[] = {
static PyObject *test(PyObject *self,PyObject *args) static PyObject *test(PyObject *self,PyObject *args)
{ {
int i = 0, r; double r;
fprintf(stderr,"Test trapping overflow\n"); fprintf(stderr,"overflow");
r = overflow(); r = overflow(1.e160);
if(r){ printerr(r);
fprintf(stderr,"(Note: No exception was raised.)\n");
PyErr_Clear();
}else{
fprintf(stderr,"Trapped:: ");
PyErr_Print();
PyErr_Clear();
}
i += r;
fprintf(stderr,"Test trapping division by zero\n"); fprintf(stderr,"\ndiv by 0");
r = db0(); r = db0(0.0);
if(r){ printerr(r);
fprintf(stderr,"(Note: No exception was raised.)\n");
PyErr_Clear();
}else{
fprintf(stderr,"Trapped:: ");
PyErr_Print();
PyErr_Clear();
}
i += r;
fprintf(stderr,"Test nested protection zones, outer zone\n"); fprintf(stderr,"\nnested outer");
r = nest1(0.0); r = nest1(0, 0.0);
if(r){ printerr(r);
fprintf(stderr,"(Note: No exception was raised.)\n");
PyErr_Clear();
}else{
fprintf(stderr,"Trapped:: ");
PyErr_Print();
PyErr_Clear();
}
i += r;
fprintf(stderr,"Test nested protection zones, inner zone\n");
fprintf(stderr,"(Note: Return will apparently come from outer zone.)\n");
r = nest1(1.0);
if(r){
fprintf(stderr,"(Note: No exception was raised.)\n");
PyErr_Clear();
}else{
fprintf(stderr,"Trapped:: ");
PyErr_Print();
PyErr_Clear();
}
i += r;
fprintf(stderr,"Test nested protection zones, trailing outer zone\n"); fprintf(stderr,"\nnested inner");
r = nest1(2.0); r = nest1(1, 1.0);
if(r){ printerr(r);
fprintf(stderr,"(Note: No exception was raised.)\n");
PyErr_Clear();
}else{
fprintf(stderr,"Trapped:: ");
PyErr_Print();
PyErr_Clear();
}
i += r;
fprintf(stderr,"Test nested function calls, prior error\n"); fprintf(stderr,"\ntrailing outer");
r = nest2(0.0); r = nest1(2, 2.0);
if(r){ printerr(r);
fprintf(stderr,"(Note: No exception was raised.)\n");
PyErr_Clear();
}else{
fprintf(stderr,"Trapped:: ");
PyErr_Print();
PyErr_Clear();
}
i += r;
fprintf(stderr,"Test nested function calls, interior error\n"); fprintf(stderr,"\nnested prior");
r = nest2(1.0); r = nest2(0, 0.0);
if(r){ printerr(r);
fprintf(stderr,"(Note: No exception was raised.)\n");
PyErr_Clear();
}else{
fprintf(stderr,"Trapped:: ");
PyErr_Print();
PyErr_Clear();
}
i += r;
fprintf(stderr,"Test nested function calls, trailing error\n"); fprintf(stderr,"\nnested interior");
r = nest2(2.0); r = nest2(1, 1.0);
if(r){ printerr(r);
fprintf(stderr,"(Note: No exception was raised.)\n");
PyErr_Clear(); fprintf(stderr,"\nnested trailing");
}else{ r = nest2(2, 2.0);
fprintf(stderr,"Trapped:: "); printerr(r);
PyErr_Print();
PyErr_Clear();
}
i += r;
fprintf(stderr,"Number of tests failed: %d\n", i);
Py_INCREF (Py_None); Py_INCREF (Py_None);
return Py_None; return Py_None;
} }
static int nest1(double x) static void printerr(double r)
{
if(r == 3.1416){
fprintf(stderr,"\tPASS\n");
PyErr_Print();
}else{
fprintf(stderr,"\tFAIL\n");
}
PyErr_Clear();
}
static double nest1(int i, double x)
{ {
double a = 1.0; double a = 1.0;
PyFPE_START_PROTECT("Division by zero, outer zone", return 0)
a = 1./x; PyFPE_START_PROTECT("Division by zero, outer zone", return 3.1416)
PyFPE_START_PROTECT("Division by zero, inner zone", return 0) if(i == 0){
a = 1./x;
}else if(i == 1){
/* This (following) message is never seen. */
PyFPE_START_PROTECT("Division by zero, inner zone", return 3.1416)
a = 1./(1. - x); a = 1./(1. - x);
PyFPE_END_PROTECT PyFPE_END_PROTECT
a = 1./(2. - x); }else if(i == 2){
a = 1./(2. - x);
}
PyFPE_END_PROTECT PyFPE_END_PROTECT
return(1);
return a;
} }
static int nest2(double x) static double nest2(int i, double x)
{ {
double a = 1.0; double a = 1.0;
PyFPE_START_PROTECT("Division by zero, prior error", return 0) PyFPE_START_PROTECT("Division by zero, prior error", return 3.1416)
a = 1./x; if(i == 0){
a = nest3(x); a = 1./x;
a = 1./(2. - x); }else if(i == 1){
a = nest3(x);
}else if(i == 2){
a = 1./(2. - x);
}
PyFPE_END_PROTECT PyFPE_END_PROTECT
return(1); return a;
} }
static double nest3(double x) static double nest3(double x)
{ {
double result; double result;
PyFPE_START_PROTECT("Division by zero, nest3 error", return 0) /* This (following) message is never seen. */
PyFPE_START_PROTECT("Division by zero, nest3 error", return 3.1416)
result = 1./(1. - x); result = 1./(1. - x);
PyFPE_END_PROTECT PyFPE_END_PROTECT
return result; return result;
} }
static int db0(void) static double db0(double x)
{ {
double a = 1.0; double a;
PyFPE_START_PROTECT("Division by zero", return 0) PyFPE_START_PROTECT("Division by zero", return 3.1416)
a = 1./(a - 1.); a = 1./x;
PyFPE_END_PROTECT PyFPE_END_PROTECT
return(1); return a;
} }
static int overflow(void) static double overflow(double b)
{ {
double a, b = 1.e200; double a;
PyFPE_START_PROTECT("Overflow", return 0) PyFPE_START_PROTECT("Overflow", return 3.1416)
a = b*b; a = b*b;
PyFPE_END_PROTECT PyFPE_END_PROTECT
return(1); return a;
} }
void initfpetest(void) void initfpetest(void)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment