Author: mattip <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit