Use PyObject_CallFunctionObjArgs()

Issue #28915: Replace PyObject_CallFunction() with
PyObject_CallFunctionObjArgs() when the format string was only made of "O"
formats, PyObject* arguments.

PyObject_CallFunctionObjArgs() avoids the creation of a temporary tuple and
doesn't have to parse a format string.
diff --git a/Objects/abstract.c b/Objects/abstract.c
index 2c5057d..d3b9ec0 100644
--- a/Objects/abstract.c
+++ b/Objects/abstract.c
@@ -2549,7 +2549,7 @@
     }
 
     if (nargs == 1 && PyTuple_Check(stack[0])) {
-        /* Special cases:
+        /* Special cases for backward compatibility:
            - PyObject_CallFunction(func, "O", tuple) calls func(*tuple)
            - PyObject_CallFunction(func, "(OOO)", arg1, arg2, arg3) calls
              func(*(arg1, arg2, arg3)): func(arg1, arg2, arg3) */
diff --git a/Objects/descrobject.c b/Objects/descrobject.c
index ee356b1..090c9cd 100644
--- a/Objects/descrobject.c
+++ b/Objects/descrobject.c
@@ -1454,7 +1454,7 @@
         doc = pold->prop_doc ? pold->prop_doc : Py_None;
     }
 
-    new =  PyObject_CallFunction(type, "OOOO", get, set, del, doc);
+    new =  PyObject_CallFunctionObjArgs(type, get, set, del, doc, NULL);
     Py_DECREF(type);
     if (new == NULL)
         return NULL;