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.
static PyObject *
complex_getnewargs(PyComplexObject *v)
{
- return Py_BuildValue("(D)", v->cval);
+ return Py_BuildValue("(D)", &v->cval);
}
static PyMethodDef complex_methods[] = {
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. */