summaryrefslogtreecommitdiffstats
path: root/Objects/descrobject.c
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2016-05-04 18:42:52 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2016-05-04 18:42:52 (GMT)
commitfcce462e9c1dacbfb71a10dbcd1d859c7a1adcaa (patch)
tree485636f1aed7db9114db9dfa355fd21ebd624fc7 /Objects/descrobject.c
parentad039f754805dc9c9d4cd95ed249984bc1405bd6 (diff)
parent7822f151b68e40376af657d267ff774439d9adb9 (diff)
downloadcpython-fcce462e9c1dacbfb71a10dbcd1d859c7a1adcaa.zip
cpython-fcce462e9c1dacbfb71a10dbcd1d859c7a1adcaa.tar.gz
cpython-fcce462e9c1dacbfb71a10dbcd1d859c7a1adcaa.tar.bz2
Issue #26811: gc.get_objects() no longer contains a broken tuple with NULL
pointer.
Diffstat (limited to 'Objects/descrobject.c')
-rw-r--r--Objects/descrobject.c30
1 files changed, 15 insertions, 15 deletions
diff --git a/Objects/descrobject.c b/Objects/descrobject.c
index 80fc662..4bc73b9 100644
--- a/Objects/descrobject.c
+++ b/Objects/descrobject.c
@@ -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;
}