]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
float_floor_div: An expression like 3.//1j crashed the interpreter, or
authorTim Peters <tim.peters@gmail.com>
Tue, 11 Dec 2001 20:31:34 +0000 (20:31 +0000)
committerTim Peters <tim.peters@gmail.com>
Tue, 11 Dec 2001 20:31:34 +0000 (20:31 +0000)
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.

Objects/floatobject.c

index 8ce0ff5f922f631cf9df9d736403ab53f44e5890..ec8f71940b286f13169eac7b0a3bb93f2b919d8b 100644 (file)
@@ -265,8 +265,11 @@ PyFloat_AsStringEx(char *buf, PyFloatObject *v, int precision)
 
 /* 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 @@ float_floor_div(PyObject *v, PyObject *w)
        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 *