Changes for Lee Busby's SIGFPE patch set.
Surround various f.p. operations with  PyFPE_{START,END}_PROTECT macros.
diff --git a/Objects/floatobject.c b/Objects/floatobject.c
index 1cebf8c..e8d0d68 100644
--- a/Objects/floatobject.c
+++ b/Objects/floatobject.c
@@ -257,7 +257,11 @@
 	floatobject *v;
 	floatobject *w;
 {
-	return newfloatobject(v->ob_fval + w->ob_fval);
+	double result;
+	PyFPE_START_PROTECT("add", return 0)
+	result = v->ob_fval + w->ob_fval;
+	PyFPE_END_PROTECT
+	return newfloatobject(result);
 }
 
 static object *
@@ -265,7 +269,11 @@
 	floatobject *v;
 	floatobject *w;
 {
-	return newfloatobject(v->ob_fval - w->ob_fval);
+	double result;
+	PyFPE_START_PROTECT("subtract", return 0)
+	result = v->ob_fval - w->ob_fval;
+	PyFPE_END_PROTECT
+	return newfloatobject(result);
 }
 
 static object *
@@ -273,7 +281,12 @@
 	floatobject *v;
 	floatobject *w;
 {
-	return newfloatobject(v->ob_fval * w->ob_fval);
+	double result;
+
+	PyFPE_START_PROTECT("multiply", return 0)
+	result = v->ob_fval * w->ob_fval;
+	PyFPE_END_PROTECT
+	return newfloatobject(result);
 }
 
 static object *
@@ -281,11 +294,15 @@
 	floatobject *v;
 	floatobject *w;
 {
+	double result;
 	if (w->ob_fval == 0) {
 		err_setstr(ZeroDivisionError, "float division");
 		return NULL;
 	}
-	return newfloatobject(v->ob_fval / w->ob_fval);
+	PyFPE_START_PROTECT("divide", return 0)
+	result = v->ob_fval / w->ob_fval;
+	PyFPE_END_PROTECT
+	return newfloatobject(result);
 }
 
 static object *
@@ -300,6 +317,7 @@
 		err_setstr(ZeroDivisionError, "float modulo");
 		return NULL;
 	}
+	PyFPE_START_PROTECT("modulo", return 0)
 	vx = v->ob_fval;
 	mod = fmod(vx, wx);
 	/* div = (vx - mod) / wx; */
@@ -307,6 +325,7 @@
 		mod += wx;
 		/* div -= 1.0; */
 	}
+	PyFPE_END_PROTECT
 	return newfloatobject(mod);
 }
 
@@ -322,6 +341,7 @@
 		err_setstr(ZeroDivisionError, "float divmod()");
 		return NULL;
 	}
+	PyFPE_START_PROTECT("divmod", return 0)
 	vx = v->ob_fval;
 	mod = fmod(vx, wx);
 	div = (vx - mod) / wx;
@@ -329,6 +349,7 @@
 		mod += wx;
 		div -= 1.0;
 	}
+	PyFPE_END_PROTECT
 	return mkvalue("(dd)", div, mod);
 }
 
@@ -367,18 +388,22 @@
 	if (iw == intw && -10000 < intw && intw < 10000) {
 		/* Sort out special cases here instead of relying on pow() */
 		if (intw == 0) { 		/* x**0 is 1, even 0**0 */
+			PyFPE_START_PROTECT("pow", return 0)
 		 	if ((object *)z!=None) {
 			 	ix=fmod(1.0, z->ob_fval);
 			 	if (ix!=0 && z->ob_fval<0) ix+=z->ob_fval;
 			}
 		 	else ix=1.0;
+			PyFPE_END_PROTECT
 	    		return newfloatobject(ix); 
 		}
 		errno = 0;
+		PyFPE_START_PROTECT("pow", return 0)
 		if (intw > 0)
 			ix = powu(iv, intw);
 		else
 			ix = 1./powu(iv, -intw);
+		PyFPE_END_PROTECT
 	}
 	else {
 		/* Sort out special cases here instead of relying on pow() */
@@ -396,7 +421,9 @@
 			return NULL;
 		}
 		errno = 0;
+		PyFPE_START_PROTECT("pow", return 0)
 		ix = pow(iv, iw);
+		PyFPE_END_PROTECT
 	}
 	CHECK(ix);
 	if (errno != 0) {
@@ -405,11 +432,13 @@
 		return NULL;
 	}
  	if ((object *)z!=None) {
+		PyFPE_START_PROTECT("pow", return 0)
 	 	ix=fmod(ix, z->ob_fval);	/* XXX To Be Rewritten */
 	 	if ( ix!=0 &&
 		      ((iv<0 && z->ob_fval>0) || (iv>0 && z->ob_fval<0) )) {
 		     ix+=z->ob_fval;
 		    }
+		PyFPE_END_PROTECT
 	}
 	return newfloatobject(ix);
 }