Author: mattip <matti.pi...@gmail.com> Branch: cpyext-ext Changeset: r81793:c830075b9c39 Date: 2016-01-11 22:54 +0200 http://bitbucket.org/pypy/pypy/changeset/c830075b9c39/
Log: avoid segfault by detecting the problem in c, move the python-level test to fail first diff --git a/pypy/module/cpyext/test/foo.c b/pypy/module/cpyext/test/foo.c --- a/pypy/module/cpyext/test/foo.c +++ b/pypy/module/cpyext/test/foo.c @@ -633,9 +633,9 @@ static char *msg = "already has a docstring"; PyObject *tp_dict = footype.tp_dict; PyObject *myobj; - static PyTypeObject *PyMemberDescr_TypePtr = NULL; - static PyTypeObject *PyGetSetDescr_TypePtr = NULL; - static PyTypeObject *PyMethodDescr_TypePtr = NULL; + static PyTypeObject *PyMemberDescr_TypePtr = NULL; /* a PyMemberDescr_Type* */ + static PyTypeObject *PyGetSetDescr_TypePtr = NULL; /* a PyGetSetDescr_Type* */ + static PyTypeObject *PyMethodDescr_TypePtr = NULL; /* a PyClassMethodDescr_Type* */ /* Don't add docstrings */ if (Py_OptimizeFlag > 1) { @@ -661,7 +661,15 @@ PyMethodDescr_TypePtr = Py_TYPE(myobj); } } - + if (PyMethodDescr_TypePtr == PyMemberDescr_TypePtr || + PyMethodDescr_TypePtr == PyGetSetDescr_TypePtr || + PyMemberDescr_TypePtr == PyGetSetDescr_TypePtr) + { + PyErr_Format(PyExc_RuntimeError, + "at least two of the 'Py{Method,Member,GetSet}Descr_Type's are the same\n" + "(in add_docstring %s %d)", __FILE__, __LINE__); + return NULL; + } if (!PyArg_ParseTuple(args, "OO!", &obj, &PyString_Type, &str)) { return NULL; } @@ -686,6 +694,7 @@ _ADDDOC(Type, new->tp_doc, new->tp_name); } else if (_TESTDOC2(MemberDescr)) { + /* docless_member ends up here */ _ADDDOC(MemberDescr, new->d_member->doc, new->d_member->name); } else if (_TESTDOC2(GetSetDescr)) { diff --git a/pypy/module/cpyext/test/test_typeobject.py b/pypy/module/cpyext/test/test_typeobject.py --- a/pypy/module/cpyext/test/test_typeobject.py +++ b/pypy/module/cpyext/test/test_typeobject.py @@ -55,9 +55,9 @@ raises(SystemError, "obj.broken_member = 42") assert module.fooType.broken_member.__doc__ is None assert module.fooType.object_member.__doc__ == "A Python object." + assert str(type(module.fooType.int_member)) == "<type 'member_descriptor'>" module.add_docstring(module.fooType.docless_member, "docstring for docless_member") assert module.fooType.docless_member.__doc__ == "docstring for docless_member" - assert str(type(module.fooType.int_member)) == "<type 'member_descriptor'>" def test_typeobject_object_member(self): module = self.import_module(name='foo') _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit