]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-44661: Update property_descr_set to use vectorcall if possible. (GH-27206)
authorDong-hee Na <donghee.na@python.org>
Mon, 19 Jul 2021 10:13:27 +0000 (19:13 +0900)
committerGitHub <noreply@github.com>
Mon, 19 Jul 2021 10:13:27 +0000 (19:13 +0900)
Misc/NEWS.d/next/Core and Builtins/2021-07-17-14-20-59.bpo-44661.BQbXiH.rst [new file with mode: 0644]
Objects/descrobject.c

diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-17-14-20-59.bpo-44661.BQbXiH.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-17-14-20-59.bpo-44661.BQbXiH.rst
new file mode 100644 (file)
index 0000000..bafa98e
--- /dev/null
@@ -0,0 +1,2 @@
+Update ``property_descr_set`` to use vectorcall if possible. Patch by Dong-hee
+Na.
index 57a9607d10c31ae1913dec1d4f56a6f7b90f8318..0565992bdb79f7ea9d74a56110b28a5de6f02b4d 100644 (file)
@@ -1614,10 +1614,13 @@ property_descr_set(PyObject *self, PyObject *obj, PyObject *value)
     propertyobject *gs = (propertyobject *)self;
     PyObject *func, *res;
 
-    if (value == NULL)
+    if (value == NULL) {
         func = gs->prop_del;
-    else
+    }
+    else {
         func = gs->prop_set;
+    }
+
     if (func == NULL) {
         if (gs->prop_name != NULL) {
             PyErr_Format(PyExc_AttributeError,
@@ -1625,7 +1628,8 @@ property_descr_set(PyObject *self, PyObject *obj, PyObject *value)
                         "can't delete attribute %R" :
                         "can't set attribute %R",
                         gs->prop_name);
-        } else {
+        }
+        else {
             PyErr_SetString(PyExc_AttributeError,
                             value == NULL ?
                             "can't delete attribute" :
@@ -1633,12 +1637,19 @@ property_descr_set(PyObject *self, PyObject *obj, PyObject *value)
         }
         return -1;
     }
-    if (value == NULL)
+
+    if (value == NULL) {
         res = PyObject_CallOneArg(func, obj);
-    else
-        res = PyObject_CallFunctionObjArgs(func, obj, value, NULL);
-    if (res == NULL)
+    }
+    else {
+        PyObject *args[] = { obj, value };
+        res = PyObject_Vectorcall(func, args, 2, NULL);
+    }
+
+    if (res == NULL) {
         return -1;
+    }
+
     Py_DECREF(res);
     return 0;
 }