Cleanup _PyMethodDef_RawFastCallDict()
Issue #29259: use a different case for METH_VARARGS and METH_VARARGS|METH_KEYWORDS to avoid testing again flags to decide if keywords should be checked or not.
This commit is contained in:
parent
a8cb515a29
commit
0a2e46835d
|
@ -93,6 +93,7 @@ _PyMethodDef_RawFastCallDict(PyMethodDef *method, PyObject *self, PyObject **arg
|
|||
PyCFunction meth;
|
||||
PyObject *result;
|
||||
int flags;
|
||||
PyObject *argstuple;
|
||||
|
||||
/* _PyMethodDef_RawFastCallDict() must not be called with an exception set,
|
||||
because it can clear it (directly or indirectly) and so the
|
||||
|
@ -140,30 +141,27 @@ _PyMethodDef_RawFastCallDict(PyMethodDef *method, PyObject *self, PyObject **arg
|
|||
break;
|
||||
|
||||
case METH_VARARGS:
|
||||
case METH_VARARGS | METH_KEYWORDS:
|
||||
{
|
||||
/* Slow-path: create a temporary tuple for positional arguments */
|
||||
PyObject *tuple;
|
||||
|
||||
if (!(flags & METH_KEYWORDS)
|
||||
&& kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) {
|
||||
goto no_keyword_error;
|
||||
}
|
||||
/* fall through next case */
|
||||
|
||||
tuple = _PyStack_AsTuple(args, nargs);
|
||||
if (tuple == NULL) {
|
||||
case METH_VARARGS | METH_KEYWORDS:
|
||||
/* Slow-path: create a temporary tuple for positional arguments */
|
||||
argstuple = _PyStack_AsTuple(args, nargs);
|
||||
if (argstuple == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (flags & METH_KEYWORDS) {
|
||||
result = (*(PyCFunctionWithKeywords)meth) (self, tuple, kwargs);
|
||||
result = (*(PyCFunctionWithKeywords)meth) (self, argstuple, kwargs);
|
||||
}
|
||||
else {
|
||||
result = (*meth) (self, tuple);
|
||||
result = (*meth) (self, argstuple);
|
||||
}
|
||||
Py_DECREF(tuple);
|
||||
Py_DECREF(argstuple);
|
||||
break;
|
||||
}
|
||||
|
||||
case METH_FASTCALL:
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue