Fix from Greg Chapman from SF bug #695651: a complex subclass

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.
This commit is contained in:
Guido van Rossum 2003-03-02 13:51:47 +00:00
parent 41bcbe3050
commit 4eadfa2b2e
1 changed files with 3 additions and 2 deletions

View File

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