diff options
Diffstat (limited to 'Objects/call.c')
-rw-r--r-- | Objects/call.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/Objects/call.c b/Objects/call.c index 6c8a640..c3cc31d 100644 --- a/Objects/call.c +++ b/Objects/call.c @@ -521,9 +521,19 @@ _PyMethodDef_RawFastCallDict(PyMethodDef *method, PyObject *self, PyObject **arg case METH_FASTCALL: { + if (kwargs != NULL && PyDict_GET_SIZE(kwargs) != 0) { + goto no_keyword_error; + } + + result = (*(_PyCFunctionFast)meth) (self, args, nargs); + break; + } + + case METH_FASTCALL | METH_KEYWORDS: + { PyObject **stack; PyObject *kwnames; - _PyCFunctionFast fastmeth = (_PyCFunctionFast)meth; + _PyCFunctionFastWithKeywords fastmeth = (_PyCFunctionFastWithKeywords)meth; if (_PyStack_UnpackDict(args, nargs, kwargs, &stack, &kwnames) < 0) { goto exit; @@ -631,8 +641,15 @@ _PyMethodDef_RawFastCallKeywords(PyMethodDef *method, PyObject *self, PyObject * break; case METH_FASTCALL: + if (nkwargs) { + goto no_keyword_error; + } + result = ((_PyCFunctionFast)meth) (self, args, nargs); + break; + + case METH_FASTCALL | METH_KEYWORDS: /* Fast-path: avoid temporary dict to pass keyword arguments */ - result = ((_PyCFunctionFast)meth) (self, args, nargs, kwnames); + result = ((_PyCFunctionFastWithKeywords)meth) (self, args, nargs, kwnames); break; case METH_VARARGS: |