@@ -113,8 +113,7 @@ static PyObject * call_function(PyObject ***, Py_ssize_t, PyObject *, uint64*, u
113113#else
114114static PyObject * call_function (PyObject * * * , Py_ssize_t , PyObject * );
115115#endif
116- static PyObject * fast_function (PyObject * , PyObject * * * , Py_ssize_t , PyObject * );
117- static PyObject * do_call (PyObject * , PyObject * * * , Py_ssize_t , PyObject * );
116+ static PyObject * fast_function (PyObject * , PyObject * * , Py_ssize_t , PyObject * );
118117static PyObject * do_call_core (PyObject * , PyObject * , PyObject * );
119118static PyObject * create_keyword_args (PyObject * , PyObject * * * , PyObject * );
120119static PyObject * load_args (PyObject * * * , Py_ssize_t );
@@ -4940,7 +4939,7 @@ if (tstate->use_tracing && tstate->c_profilefunc) { \
49404939 }
49414940
49424941static PyObject *
4943- call_function (PyObject * * * pp_stack , Py_ssize_t oparg , PyObject * names
4942+ call_function (PyObject * * * pp_stack , Py_ssize_t oparg , PyObject * kwnames
49444943#ifdef WITH_TSC
49454944 , uint64 * pintr0 , uint64 * pintr1
49464945#endif
@@ -4949,8 +4948,8 @@ call_function(PyObject ***pp_stack, Py_ssize_t oparg, PyObject *names
49494948 PyObject * * pfunc = (* pp_stack ) - oparg - 1 ;
49504949 PyObject * func = * pfunc ;
49514950 PyObject * x , * w ;
4952- Py_ssize_t nk = names == NULL ? 0 : PyTuple_GET_SIZE (names );
4953- Py_ssize_t nargs = oparg - nk ;
4951+ Py_ssize_t nkwargs = ( kwnames == NULL ) ? 0 : PyTuple_GET_SIZE (kwnames );
4952+ Py_ssize_t nargs = oparg - nkwargs ;
49544953
49554954 /* Always dispatch PyCFunction first, because these are
49564955 presumed to be the most frequent callable object.
@@ -4960,7 +4959,7 @@ call_function(PyObject ***pp_stack, Py_ssize_t oparg, PyObject *names
49604959 PyThreadState * tstate = PyThreadState_GET ();
49614960
49624961 PCALL (PCALL_CFUNCTION );
4963- if (names == NULL && flags & (METH_NOARGS | METH_O )) {
4962+ if (kwnames == NULL && flags & (METH_NOARGS | METH_O )) {
49644963 PyCFunction meth = PyCFunction_GET_FUNCTION (func );
49654964 PyObject * self = PyCFunction_GET_SELF (func );
49664965 if (flags & METH_NOARGS && nargs == 0 ) {
@@ -4982,8 +4981,8 @@ call_function(PyObject ***pp_stack, Py_ssize_t oparg, PyObject *names
49824981 }
49834982 else {
49844983 PyObject * callargs , * kwdict = NULL ;
4985- if (names != NULL ) {
4986- kwdict = create_keyword_args (names , pp_stack , func );
4984+ if (kwnames != NULL ) {
4985+ kwdict = create_keyword_args (kwnames , pp_stack , func );
49874986 if (kwdict == NULL ) {
49884987 x = NULL ;
49894988 goto cfuncerror ;
@@ -5003,6 +5002,9 @@ call_function(PyObject ***pp_stack, Py_ssize_t oparg, PyObject *names
50035002 }
50045003 }
50055004 else {
5005+ Py_ssize_t nkwargs = (kwnames == NULL ) ? 0 : PyTuple_GET_SIZE (kwnames );
5006+ PyObject * * stack ;
5007+
50065008 if (PyMethod_Check (func ) && PyMethod_GET_SELF (func ) != NULL ) {
50075009 /* optimize access to bound methods */
50085010 PyObject * self = PyMethod_GET_SELF (func );
@@ -5018,11 +5020,14 @@ call_function(PyObject ***pp_stack, Py_ssize_t oparg, PyObject *names
50185020 Py_INCREF (func );
50195021 }
50205022
5023+ stack = (* pp_stack ) - nargs - nkwargs ;
5024+
50215025 READ_TIMESTAMP (* pintr0 );
50225026 if (PyFunction_Check (func )) {
5023- x = fast_function (func , pp_stack , nargs , names );
5024- } else {
5025- x = do_call (func , pp_stack , nargs , names );
5027+ x = fast_function (func , stack , nargs , kwnames );
5028+ }
5029+ else {
5030+ x = _PyObject_FastCallKeywords (func , stack , nargs , kwnames );
50265031 }
50275032 READ_TIMESTAMP (* pintr1 );
50285033
@@ -5055,8 +5060,8 @@ call_function(PyObject ***pp_stack, Py_ssize_t oparg, PyObject *names
50555060*/
50565061
50575062static PyObject *
5058- _PyFunction_FastCallNoKw (PyCodeObject * co , PyObject * * args , Py_ssize_t nargs ,
5059- PyObject * globals )
5063+ _PyFunction_FastCall (PyCodeObject * co , PyObject * * args , Py_ssize_t nargs ,
5064+ PyObject * globals )
50605065{
50615066 PyFrameObject * f ;
50625067 PyThreadState * tstate = PyThreadState_GET ();
@@ -5091,19 +5096,19 @@ _PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t nargs,
50915096 return result ;
50925097}
50935098
5094- /* Similar to _PyFunction_FastCall() but keywords are passed a (key, value)
5095- pairs in stack */
50965099static PyObject *
5097- fast_function (PyObject * func , PyObject * * * pp_stack , Py_ssize_t nargs , PyObject * names )
5100+ fast_function (PyObject * func , PyObject * * stack ,
5101+ Py_ssize_t nargs , PyObject * kwnames )
50985102{
50995103 PyCodeObject * co = (PyCodeObject * )PyFunction_GET_CODE (func );
51005104 PyObject * globals = PyFunction_GET_GLOBALS (func );
51015105 PyObject * argdefs = PyFunction_GET_DEFAULTS (func );
51025106 PyObject * kwdefs , * closure , * name , * qualname ;
51035107 PyObject * * d ;
5104- Py_ssize_t nkwargs = names == NULL ? 0 : PyTuple_GET_SIZE (names );
5108+ Py_ssize_t nkwargs = ( kwnames == NULL ) ? 0 : PyTuple_GET_SIZE (kwnames );
51055109 Py_ssize_t nd ;
5106- PyObject * * stack = (* pp_stack )- nargs - nkwargs ;
5110+
5111+ assert ((nargs == 0 && nkwargs == 0 ) || stack != NULL );
51075112
51085113 PCALL (PCALL_FUNCTION );
51095114 PCALL (PCALL_FAST_FUNCTION );
@@ -5112,15 +5117,14 @@ fast_function(PyObject *func, PyObject ***pp_stack, Py_ssize_t nargs, PyObject *
51125117 co -> co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE ))
51135118 {
51145119 if (argdefs == NULL && co -> co_argcount == nargs ) {
5115- return _PyFunction_FastCallNoKw (co , stack , nargs , globals );
5120+ return _PyFunction_FastCall (co , stack , nargs , globals );
51165121 }
51175122 else if (nargs == 0 && argdefs != NULL
51185123 && co -> co_argcount == Py_SIZE (argdefs )) {
51195124 /* function called with no arguments, but all parameters have
51205125 a default value: use default values as arguments .*/
51215126 stack = & PyTuple_GET_ITEM (argdefs , 0 );
5122- return _PyFunction_FastCallNoKw (co , stack , Py_SIZE (argdefs ),
5123- globals );
5127+ return _PyFunction_FastCall (co , stack , Py_SIZE (argdefs ), globals );
51245128 }
51255129 }
51265130
@@ -5140,11 +5144,18 @@ fast_function(PyObject *func, PyObject ***pp_stack, Py_ssize_t nargs, PyObject *
51405144 return _PyEval_EvalCodeWithName ((PyObject * )co , globals , (PyObject * )NULL ,
51415145 stack , nargs ,
51425146 NULL , 0 ,
5143- names , stack + nargs ,
5147+ kwnames , stack + nargs ,
51445148 d , (int )nd , kwdefs ,
51455149 closure , name , qualname );
51465150}
51475151
5152+ PyObject *
5153+ _PyFunction_FastCallKeywords (PyObject * func , PyObject * * stack ,
5154+ Py_ssize_t nargs , PyObject * kwnames )
5155+ {
5156+ return fast_function (func , stack , nargs , kwnames );
5157+ }
5158+
51485159PyObject *
51495160_PyFunction_FastCallDict (PyObject * func , PyObject * * args , Py_ssize_t nargs ,
51505161 PyObject * kwargs )
@@ -5172,15 +5183,14 @@ _PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs,
51725183 {
51735184 /* Fast paths */
51745185 if (argdefs == NULL && co -> co_argcount == nargs ) {
5175- return _PyFunction_FastCallNoKw (co , args , nargs , globals );
5186+ return _PyFunction_FastCall (co , args , nargs , globals );
51765187 }
51775188 else if (nargs == 0 && argdefs != NULL
51785189 && co -> co_argcount == Py_SIZE (argdefs )) {
51795190 /* function called with no arguments, but all parameters have
51805191 a default value: use default values as arguments .*/
51815192 args = & PyTuple_GET_ITEM (argdefs , 0 );
5182- return _PyFunction_FastCallNoKw (co , args , Py_SIZE (argdefs ),
5183- globals );
5193+ return _PyFunction_FastCall (co , args , Py_SIZE (argdefs ), globals );
51845194 }
51855195 }
51865196
@@ -5242,8 +5252,8 @@ create_keyword_args(PyObject *names, PyObject ***pp_stack,
52425252 return NULL ;
52435253 while (-- nk >= 0 ) {
52445254 int err ;
5245- PyObject * value = EXT_POP (* pp_stack );
52465255 PyObject * key = PyTuple_GET_ITEM (names , nk );
5256+ PyObject * value = EXT_POP (* pp_stack );
52475257 if (PyDict_GetItem (kwdict , key ) != NULL ) {
52485258 PyErr_Format (PyExc_TypeError ,
52495259 "%.200s%s got multiple values "
@@ -5281,33 +5291,6 @@ load_args(PyObject ***pp_stack, Py_ssize_t nargs)
52815291 return args ;
52825292}
52835293
5284- static PyObject *
5285- do_call (PyObject * func , PyObject * * * pp_stack , Py_ssize_t nargs , PyObject * kwnames )
5286- {
5287- PyObject * callargs , * kwdict , * result ;
5288-
5289- if (kwnames != NULL ) {
5290- kwdict = create_keyword_args (kwnames , pp_stack , func );
5291- if (kwdict == NULL ) {
5292- return NULL ;
5293- }
5294- }
5295- else {
5296- kwdict = NULL ;
5297- }
5298-
5299- callargs = load_args (pp_stack , nargs );
5300- if (callargs == NULL ) {
5301- Py_XDECREF (kwdict );
5302- return NULL ;
5303- }
5304-
5305- result = do_call_core (func , callargs , kwdict );
5306- Py_XDECREF (callargs );
5307- Py_XDECREF (kwdict );
5308- return result ;
5309- }
5310-
53115294static PyObject *
53125295do_call_core (PyObject * func , PyObject * callargs , PyObject * kwdict )
53135296{
0 commit comments