diff Objects/floatobject.c @ 21354:fbddb64d21c2 legacy-trunk

float_floor_div: An expression like 3.//1j crashed the interpreter, or delivered bizarre results. Check float_divmod for a Py_NotImplemented return and pass it along (instead of treating Py_NotImplemented as a 2-tuple). CONVERT_TO_DOUBLE: Added comments; this macro is obscure.
author Tim Peters <tim.peters@gmail.com>
date Tue, 11 Dec 2001 20:31:34 +0000
parents 257c938900a6
children 4b6eda7d0c8f
line wrap: on
line diff
--- a/Objects/floatobject.c	Tue Dec 11 19:57:24 2001 +0000
+++ b/Objects/floatobject.c	Tue Dec 11 20:31:34 2001 +0000
@@ -265,8 +265,11 @@
 
 /* Macro and helper that convert PyObject obj to a C double and store
    the value in dbl; this replaces the functionality of the coercion
-   slot function */
-
+   slot function.  If conversion to double raises an exception, obj is
+   set to NULL, and the function invoking this macro returns NULL.  If
+   obj is not of float, int or long type, Py_NotImplemented is incref'ed,
+   stored in obj, and returned from the function invoking this macro.
+*/
 #define CONVERT_TO_DOUBLE(obj, dbl)			\
 	if (PyFloat_Check(obj))				\
 		dbl = PyFloat_AS_DOUBLE(obj);		\
@@ -519,13 +522,13 @@
 	PyObject *t, *r;
 
 	t = float_divmod(v, w);
-	if (t != NULL) {
-		r = PyTuple_GET_ITEM(t, 0);
-		Py_INCREF(r);
-		Py_DECREF(t);
-		return r;
-	}
-	return NULL;
+	if (t == NULL || t == Py_NotImplemented)
+		return t;
+	assert(PyTuple_CheckExact(t));
+	r = PyTuple_GET_ITEM(t, 0);
+	Py_INCREF(r);
+	Py_DECREF(t);
+	return r;
 }
 
 static PyObject *