[Python-checkins] cpython: Issue #24276: Fixed optimization of property descriptor getter.

serhiy.storchaka python-checkins at python.org
Sun May 24 20:38:42 CEST 2015


https://hg.python.org/cpython/rev/5dbf3d932a59
changeset:   96271:5dbf3d932a59
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Sun May 24 21:38:06 2015 +0300
summary:
  Issue #24276: Fixed optimization of property descriptor getter.

files:
  Misc/NEWS             |   2 ++
  Objects/descrobject.c |  25 +++++++++++++++++++++----
  2 files changed, 23 insertions(+), 4 deletions(-)


diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,8 @@
 Core and Builtins
 -----------------
 
+- Issue #24276: Fixed optimization of property descriptor getter.
+
 - Issue #24268: PEP 489: Multi-phase extension module initialization
 
 - Issue #23955: Add pyvenv.cfg option to suppress registry/environment
diff --git a/Objects/descrobject.c b/Objects/descrobject.c
--- a/Objects/descrobject.c
+++ b/Objects/descrobject.c
@@ -1372,7 +1372,8 @@
 static PyObject *
 property_descr_get(PyObject *self, PyObject *obj, PyObject *type)
 {
-    static PyObject *args = NULL;
+    static PyObject * volatile cached_args = NULL;
+    PyObject *args;
     PyObject *ret;
     propertyobject *gs = (propertyobject *)self;
 
@@ -1384,12 +1385,28 @@
         PyErr_SetString(PyExc_AttributeError, "unreadable attribute");
         return NULL;
     }
-    if (!args && !(args = PyTuple_New(1))) {
-        return NULL;
+    args = cached_args;
+    if (!args || Py_REFCNT(args) != 1) {
+        Py_CLEAR(cached_args);
+        if (!(cached_args = args = PyTuple_New(1)))
+            return NULL;
     }
+    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);
-    PyTuple_SET_ITEM(args, 0, 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);
+        }
+    }
+    Py_DECREF(args);
     return ret;
 }
 

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


More information about the Python-checkins mailing list