diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2016-05-04 18:42:52 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2016-05-04 18:42:52 (GMT) |
commit | fcce462e9c1dacbfb71a10dbcd1d859c7a1adcaa (patch) | |
tree | 485636f1aed7db9114db9dfa355fd21ebd624fc7 /Objects/descrobject.c | |
parent | ad039f754805dc9c9d4cd95ed249984bc1405bd6 (diff) | |
parent | 7822f151b68e40376af657d267ff774439d9adb9 (diff) | |
download | cpython-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.c | 30 |
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; } |