[Python-checkins] r51110 - in python/trunk: Lib/test/test_descr.py Misc/NEWS Modules/_testcapimodule.c Objects/descrobject.c
georg.brandl
python-checkins at python.org
Fri Aug 4 20:03:38 CEST 2006
Author: georg.brandl
Date: Fri Aug 4 20:03:37 2006
New Revision: 51110
Modified:
python/trunk/Lib/test/test_descr.py
python/trunk/Misc/NEWS
python/trunk/Modules/_testcapimodule.c
python/trunk/Objects/descrobject.c
Log:
Change fix for segfaulting property(), add a NEWS entry and a test.
Modified: python/trunk/Lib/test/test_descr.py
==============================================================================
--- python/trunk/Lib/test/test_descr.py (original)
+++ python/trunk/Lib/test/test_descr.py Fri Aug 4 20:03:37 2006
@@ -2024,6 +2024,16 @@
prop2 = property(fset=setter)
vereq(prop2.__doc__, None)
+ # this segfaulted in 2.5b2
+ try:
+ import _testcapi
+ except ImportError:
+ pass
+ else:
+ class X(object):
+ p = property(_testcapi.test_with_docstring)
+
+
def supers():
if verbose: print "Testing super..."
Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS (original)
+++ python/trunk/Misc/NEWS Fri Aug 4 20:03:37 2006
@@ -21,6 +21,8 @@
in the byte code and co_consts even if they were not used, ie
immediately popped off the stack.
+- Fixed a reference-counting problem in property().
+
Library
-------
Modified: python/trunk/Modules/_testcapimodule.c
==============================================================================
--- python/trunk/Modules/_testcapimodule.c (original)
+++ python/trunk/Modules/_testcapimodule.c Fri Aug 4 20:03:37 2006
@@ -706,6 +706,13 @@
#undef CHECK_1_FORMAT
}
+/* This is here to provide a docstring for test_descr. */
+static PyObject *
+test_with_docstring(PyObject *self)
+{
+ Py_RETURN_NONE;
+}
+
static PyMethodDef TestMethods[] = {
{"raise_exception", raise_exception, METH_VARARGS},
{"test_config", (PyCFunction)test_config, METH_NOARGS},
@@ -716,6 +723,8 @@
{"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
{"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS},
{"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS},
+ {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
+ PyDoc_STR("This is a pretty normal docstring.")},
{"getargs_tuple", getargs_tuple, METH_VARARGS},
{"getargs_b", getargs_b, METH_VARARGS},
Modified: python/trunk/Objects/descrobject.c
==============================================================================
--- python/trunk/Objects/descrobject.c (original)
+++ python/trunk/Objects/descrobject.c Fri Aug 4 20:03:37 2006
@@ -1190,19 +1190,21 @@
if (del == Py_None)
del = NULL;
- /* if no docstring given and the getter has one, use that one */
- if ((doc == NULL || doc == Py_None) && get != NULL &&
- PyObject_HasAttrString(get, "__doc__")) {
- doc = PyObject_GetAttrString(get, "__doc__");
- if (doc == NULL)
- return -1;
- } else {
- Py_XINCREF(doc);
- }
-
Py_XINCREF(get);
Py_XINCREF(set);
Py_XINCREF(del);
+ Py_XINCREF(doc);
+
+ /* if no docstring given and the getter has one, use that one */
+ if ((doc == NULL || doc == Py_None) && get != NULL) {
+ PyObject *get_doc = PyObject_GetAttrString(get, "__doc__");
+ if (get_doc != NULL) {
+ Py_XDECREF(doc);
+ doc = get_doc; /* get_doc already INCREF'd by GetAttr */
+ } else {
+ PyErr_Clear();
+ }
+ }
gs->prop_get = get;
gs->prop_set = set;
More information about the Python-checkins
mailing list