mirror of https://github.com/python/cpython
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:
parent
41bcbe3050
commit
4eadfa2b2e
|
@ -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. */
|
||||||
|
|
Loading…
Reference in New Issue