Issue #26811: gc.get_objects() no longer contains a broken tuple with NULL

pointer.
This commit is contained in:
Serhiy Storchaka 2016-05-04 21:42:52 +03:00
commit fcce462e9c
2 changed files with 18 additions and 15 deletions

View File

@ -10,6 +10,9 @@ Release date: tba
Core and Builtins
-----------------
- Issue #26811: gc.get_objects() no longer contains a broken tuple with NULL
pointer.
- Issue #20120: Use RawConfigParser for .pypirc parsing,
removing support for interpolation unintentionally added
with move to Python 3. Behavior no longer does any

View File

@ -1386,27 +1386,27 @@ property_descr_get(PyObject *self, PyObject *obj, PyObject *type)
return NULL;
}
args = cached_args;
if (!args || Py_REFCNT(args) != 1) {
Py_CLEAR(cached_args);
if (!(cached_args = args = PyTuple_New(1)))
cached_args = NULL;
if (!args) {
args = PyTuple_New(1);
if (!args)
return NULL;
_PyObject_GC_UNTRACK(args);
}
Py_INCREF(args);
assert (Py_REFCNT(args) == 2);
Py_INCREF(obj);
PyTuple_SET_ITEM(args, 0, obj);
ret = PyObject_Call(gs->prop_get, args, NULL);
if (args == cached_args) {
if (Py_REFCNT(args) == 2) {
obj = PyTuple_GET_ITEM(args, 0);
PyTuple_SET_ITEM(args, 0, NULL);
Py_XDECREF(obj);
}
else {
Py_CLEAR(cached_args);
}
if (cached_args == NULL && Py_REFCNT(args) == 1) {
assert(Py_SIZE(args) == 1);
assert(PyTuple_GET_ITEM(args, 0) == obj);
cached_args = args;
Py_DECREF(obj);
}
else {
assert(Py_REFCNT(args) >= 1);
_PyObject_GC_TRACK(args);
Py_DECREF(args);
}
Py_DECREF(args);
return ret;
}