bpo-44661: Update property_descr_set to use vectorcall if possible. (GH-27206)

This commit is contained in:
Dong-hee Na 2021-07-19 19:13:27 +09:00 committed by GitHub
parent d09c134178
commit 635bfe8162
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 7 deletions

View File

@ -0,0 +1,2 @@
Update ``property_descr_set`` to use vectorcall if possible. Patch by Dong-hee
Na.

View 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;
}