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

Reply via email to