[Python-checkins] cpython (3.5): Issue #26811: gc.get_objects() no longer contains a broken tuple with NULL

serhiy.storchaka python-checkins at python.org
Wed May 4 14:43:39 EDT 2016


https://hg.python.org/cpython/rev/a98ef122d73d
changeset:   101226:a98ef122d73d
branch:      3.5
parent:      101224:eae59b6bf133
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Wed May 04 21:42:05 2016 +0300
summary:
  Issue #26811: gc.get_objects() no longer contains a broken tuple with NULL
pointer.

files:
  Misc/NEWS             |   3 +++
  Objects/descrobject.c |  30 +++++++++++++++---------------
  2 files changed, 18 insertions(+), 15 deletions(-)


diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@
 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
diff --git a/Objects/descrobject.c b/Objects/descrobject.c
--- a/Objects/descrobject.c
+++ b/Objects/descrobject.c
@@ -1386,27 +1386,27 @@
         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);
     }
-    Py_DECREF(args);
+    else {
+        assert(Py_REFCNT(args) >= 1);
+        _PyObject_GC_TRACK(args);
+        Py_DECREF(args);
+    }
     return ret;
 }
 

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list