@@ -113,8 +113,7 @@ static PyObject * call_function(PyObject ***, Py_ssize_t, PyObject *, uint64*, u
113
113
#else
114
114
static PyObject * call_function (PyObject * * * , Py_ssize_t , PyObject * );
115
115
#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 * );
118
117
static PyObject * do_call_core (PyObject * , PyObject * , PyObject * );
119
118
static PyObject * create_keyword_args (PyObject * , PyObject * * * , PyObject * );
120
119
static PyObject * load_args (PyObject * * * , Py_ssize_t );
@@ -4940,7 +4939,7 @@ if (tstate->use_tracing && tstate->c_profilefunc) { \
4940
4939
}
4941
4940
4942
4941
static 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
4944
4943
#ifdef WITH_TSC
4945
4944
, uint64 * pintr0 , uint64 * pintr1
4946
4945
#endif
@@ -4949,8 +4948,8 @@ call_function(PyObject ***pp_stack, Py_ssize_t oparg, PyObject *names
4949
4948
PyObject * * pfunc = (* pp_stack ) - oparg - 1 ;
4950
4949
PyObject * func = * pfunc ;
4951
4950
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 ;
4954
4953
4955
4954
/* Always dispatch PyCFunction first, because these are
4956
4955
presumed to be the most frequent callable object.
@@ -4960,7 +4959,7 @@ call_function(PyObject ***pp_stack, Py_ssize_t oparg, PyObject *names
4960
4959
PyThreadState * tstate = PyThreadState_GET ();
4961
4960
4962
4961
PCALL (PCALL_CFUNCTION );
4963
- if (names == NULL && flags & (METH_NOARGS | METH_O )) {
4962
+ if (kwnames == NULL && flags & (METH_NOARGS | METH_O )) {
4964
4963
PyCFunction meth = PyCFunction_GET_FUNCTION (func );
4965
4964
PyObject * self = PyCFunction_GET_SELF (func );
4966
4965
if (flags & METH_NOARGS && nargs == 0 ) {
@@ -4982,8 +4981,8 @@ call_function(PyObject ***pp_stack, Py_ssize_t oparg, PyObject *names
4982
4981
}
4983
4982
else {
4984
4983
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 );
4987
4986
if (kwdict == NULL ) {
4988
4987
x = NULL ;
4989
4988
goto cfuncerror ;
@@ -5003,6 +5002,9 @@ call_function(PyObject ***pp_stack, Py_ssize_t oparg, PyObject *names
5003
5002
}
5004
5003
}
5005
5004
else {
5005
+ Py_ssize_t nkwargs = (kwnames == NULL ) ? 0 : PyTuple_GET_SIZE (kwnames );
5006
+ PyObject * * stack ;
5007
+
5006
5008
if (PyMethod_Check (func ) && PyMethod_GET_SELF (func ) != NULL ) {
5007
5009
/* optimize access to bound methods */
5008
5010
PyObject * self = PyMethod_GET_SELF (func );
@@ -5018,11 +5020,14 @@ call_function(PyObject ***pp_stack, Py_ssize_t oparg, PyObject *names
5018
5020
Py_INCREF (func );
5019
5021
}
5020
5022
5023
+ stack = (* pp_stack ) - nargs - nkwargs ;
5024
+
5021
5025
READ_TIMESTAMP (* pintr0 );
5022
5026
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 );
5026
5031
}
5027
5032
READ_TIMESTAMP (* pintr1 );
5028
5033
@@ -5055,8 +5060,8 @@ call_function(PyObject ***pp_stack, Py_ssize_t oparg, PyObject *names
5055
5060
*/
5056
5061
5057
5062
static 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 )
5060
5065
{
5061
5066
PyFrameObject * f ;
5062
5067
PyThreadState * tstate = PyThreadState_GET ();
@@ -5091,19 +5096,19 @@ _PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t nargs,
5091
5096
return result ;
5092
5097
}
5093
5098
5094
- /* Similar to _PyFunction_FastCall() but keywords are passed a (key, value)
5095
- pairs in stack */
5096
5099
static 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 )
5098
5102
{
5099
5103
PyCodeObject * co = (PyCodeObject * )PyFunction_GET_CODE (func );
5100
5104
PyObject * globals = PyFunction_GET_GLOBALS (func );
5101
5105
PyObject * argdefs = PyFunction_GET_DEFAULTS (func );
5102
5106
PyObject * kwdefs , * closure , * name , * qualname ;
5103
5107
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 );
5105
5109
Py_ssize_t nd ;
5106
- PyObject * * stack = (* pp_stack )- nargs - nkwargs ;
5110
+
5111
+ assert ((nargs == 0 && nkwargs == 0 ) || stack != NULL );
5107
5112
5108
5113
PCALL (PCALL_FUNCTION );
5109
5114
PCALL (PCALL_FAST_FUNCTION );
@@ -5112,15 +5117,14 @@ fast_function(PyObject *func, PyObject ***pp_stack, Py_ssize_t nargs, PyObject *
5112
5117
co -> co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE ))
5113
5118
{
5114
5119
if (argdefs == NULL && co -> co_argcount == nargs ) {
5115
- return _PyFunction_FastCallNoKw (co , stack , nargs , globals );
5120
+ return _PyFunction_FastCall (co , stack , nargs , globals );
5116
5121
}
5117
5122
else if (nargs == 0 && argdefs != NULL
5118
5123
&& co -> co_argcount == Py_SIZE (argdefs )) {
5119
5124
/* function called with no arguments, but all parameters have
5120
5125
a default value: use default values as arguments .*/
5121
5126
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 );
5124
5128
}
5125
5129
}
5126
5130
@@ -5140,11 +5144,18 @@ fast_function(PyObject *func, PyObject ***pp_stack, Py_ssize_t nargs, PyObject *
5140
5144
return _PyEval_EvalCodeWithName ((PyObject * )co , globals , (PyObject * )NULL ,
5141
5145
stack , nargs ,
5142
5146
NULL , 0 ,
5143
- names , stack + nargs ,
5147
+ kwnames , stack + nargs ,
5144
5148
d , (int )nd , kwdefs ,
5145
5149
closure , name , qualname );
5146
5150
}
5147
5151
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
+
5148
5159
PyObject *
5149
5160
_PyFunction_FastCallDict (PyObject * func , PyObject * * args , Py_ssize_t nargs ,
5150
5161
PyObject * kwargs )
@@ -5172,15 +5183,14 @@ _PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs,
5172
5183
{
5173
5184
/* Fast paths */
5174
5185
if (argdefs == NULL && co -> co_argcount == nargs ) {
5175
- return _PyFunction_FastCallNoKw (co , args , nargs , globals );
5186
+ return _PyFunction_FastCall (co , args , nargs , globals );
5176
5187
}
5177
5188
else if (nargs == 0 && argdefs != NULL
5178
5189
&& co -> co_argcount == Py_SIZE (argdefs )) {
5179
5190
/* function called with no arguments, but all parameters have
5180
5191
a default value: use default values as arguments .*/
5181
5192
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 );
5184
5194
}
5185
5195
}
5186
5196
@@ -5242,8 +5252,8 @@ create_keyword_args(PyObject *names, PyObject ***pp_stack,
5242
5252
return NULL ;
5243
5253
while (-- nk >= 0 ) {
5244
5254
int err ;
5245
- PyObject * value = EXT_POP (* pp_stack );
5246
5255
PyObject * key = PyTuple_GET_ITEM (names , nk );
5256
+ PyObject * value = EXT_POP (* pp_stack );
5247
5257
if (PyDict_GetItem (kwdict , key ) != NULL ) {
5248
5258
PyErr_Format (PyExc_TypeError ,
5249
5259
"%.200s%s got multiple values "
@@ -5281,33 +5291,6 @@ load_args(PyObject ***pp_stack, Py_ssize_t nargs)
5281
5291
return args ;
5282
5292
}
5283
5293
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
-
5311
5294
static PyObject *
5312
5295
do_call_core (PyObject * func , PyObject * callargs , PyObject * kwdict )
5313
5296
{
0 commit comments