Issue #24276: Fixed optimization of property descriptor getter.
diff --git a/Objects/descrobject.c b/Objects/descrobject.c
index 24b24e7..1a69b6b 100644
--- 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;
 }