]> granicus.if.org Git - python/commitdiff
Fix from Greg Chapman from SF bug #695651: a complex subclass
authorGuido van Rossum <guido@python.org>
Sun, 2 Mar 2003 13:51:47 +0000 (13:51 +0000)
committerGuido van Rossum <guido@python.org>
Sun, 2 Mar 2003 13:51:47 +0000 (13:51 +0000)
constructor, when passed a single complex argument, returns the
argument unchanged.  This should be done only for the complex base
class; a complex subclass should of course cast the value to the
subclass in this case.

The fix also revealed a segfault in complex_getnewargs(): the argument
for the Py_BuildValue() format code "D" is the *address* of a
Py_complex struct, not the value.  (This corroborated by the API
documentation.)

I expect this needs to be backported to 2.2.3.

Objects/complexobject.c

index 201da4d3febdca132c24f1b5392e5cd5af55256f..a346ac25a6407ec4fc7a457f4724af0c8b5ad2ce 100644 (file)
@@ -642,7 +642,7 @@ complex_conjugate(PyObject *self)
 static PyObject *
 complex_getnewargs(PyComplexObject *v)
 {
-       return Py_BuildValue("(D)", v->cval);
+       return Py_BuildValue("(D)", &v->cval);
 }
 
 static PyMethodDef complex_methods[] = {
@@ -832,7 +832,8 @@ complex_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
                return NULL;
 
        /* Special-case for single argumet that is already complex */
-       if (PyComplex_CheckExact(r) && i == NULL) {
+       if (PyComplex_CheckExact(r) && i == NULL &&
+           type == &PyComplex_Type) {
                /* Note that we can't know whether it's safe to return
                   a complex *subclass* instance as-is, hence the restriction
                   to exact complexes here.  */