@@ -115,8 +115,7 @@ static PyObject * call_function(PyObject ***, Py_ssize_t, PyObject *, uint64*, u
115
115
#else
116
116
static PyObject * call_function (PyObject * * * , Py_ssize_t , PyObject * );
117
117
#endif
118
- static PyObject * fast_function (PyObject * , PyObject * * * , Py_ssize_t , PyObject * );
119
- static PyObject * do_call (PyObject * , PyObject * * * , Py_ssize_t , PyObject * );
118
+ static PyObject * fast_function (PyObject * , PyObject * * , Py_ssize_t , PyObject * );
120
119
static PyObject * do_call_core (PyObject * , PyObject * , PyObject * );
121
120
static PyObject * create_keyword_args (PyObject * , PyObject * * * , PyObject * );
122
121
static PyObject * load_args (PyObject * * * , Py_ssize_t );
@@ -5440,7 +5439,7 @@ if (tstate->use_tracing && tstate->c_profilefunc) { \
5440
5439
}
5441
5440
5442
5441
static PyObject *
5443
- call_function (PyObject * * * pp_stack , Py_ssize_t oparg , PyObject * names
5442
+ call_function (PyObject * * * pp_stack , Py_ssize_t oparg , PyObject * kwnames
5444
5443
#ifdef WITH_TSC
5445
5444
, uint64 * pintr0 , uint64 * pintr1
5446
5445
#endif
@@ -5449,8 +5448,8 @@ call_function(PyObject ***pp_stack, Py_ssize_t oparg, PyObject *names
5449
5448
PyObject * * pfunc = (* pp_stack ) - oparg - 1 ;
5450
5449
PyObject * func = * pfunc ;
5451
5450
PyObject * x , * w ;
5452
- Py_ssize_t nk = names == NULL ? 0 : PyTuple_GET_SIZE (names );
5453
- Py_ssize_t nargs = oparg - nk ;
5451
+ Py_ssize_t nkwargs = ( kwnames == NULL ) ? 0 : PyTuple_GET_SIZE (kwnames );
5452
+ Py_ssize_t nargs = oparg - nkwargs ;
5454
5453
5455
5454
/* Always dispatch PyCFunction first, because these are
5456
5455
presumed to be the most frequent callable object.
@@ -5460,7 +5459,7 @@ call_function(PyObject ***pp_stack, Py_ssize_t oparg, PyObject *names
5460
5459
PyThreadState * tstate = PyThreadState_GET ();
5461
5460
5462
5461
PCALL (PCALL_CFUNCTION );
5463
- if (names == NULL && flags & (METH_NOARGS | METH_O )) {
5462
+ if (kwnames == NULL && flags & (METH_NOARGS | METH_O )) {
5464
5463
PyCFunction meth = PyCFunction_GET_FUNCTION (func );
5465
5464
PyObject * self = PyCFunction_GET_SELF (func );
5466
5465
STACKLESS_PROPOSE_FLAG (flags & METH_STACKLESS );
@@ -5484,8 +5483,8 @@ call_function(PyObject ***pp_stack, Py_ssize_t oparg, PyObject *names
5484
5483
}
5485
5484
else {
5486
5485
PyObject * callargs , * kwdict = NULL ;
5487
- if (names != NULL ) {
5488
- kwdict = create_keyword_args (names , pp_stack , func );
5486
+ if (kwnames != NULL ) {
5487
+ kwdict = create_keyword_args (kwnames , pp_stack , func );
5489
5488
if (kwdict == NULL ) {
5490
5489
x = NULL ;
5491
5490
goto cfuncerror ;
@@ -5507,6 +5506,9 @@ call_function(PyObject ***pp_stack, Py_ssize_t oparg, PyObject *names
5507
5506
STACKLESS_ASSERT ();
5508
5507
}
5509
5508
else {
5509
+ Py_ssize_t nkwargs = (kwnames == NULL ) ? 0 : PyTuple_GET_SIZE (kwnames );
5510
+ PyObject * * stack ;
5511
+
5510
5512
if (PyMethod_Check (func ) && PyMethod_GET_SELF (func ) != NULL ) {
5511
5513
/* optimize access to bound methods */
5512
5514
PyObject * self = PyMethod_GET_SELF (func );
@@ -5522,13 +5524,16 @@ call_function(PyObject ***pp_stack, Py_ssize_t oparg, PyObject *names
5522
5524
Py_INCREF (func );
5523
5525
}
5524
5526
5527
+ stack = (* pp_stack ) - nargs - nkwargs ;
5528
+
5525
5529
READ_TIMESTAMP (* pintr0 );
5526
5530
if (PyFunction_Check (func )) {
5527
5531
STACKLESS_PROPOSE_ALL ();
5528
- x = fast_function (func , pp_stack , nargs , names );
5532
+ x = fast_function (func , stack , nargs , kwnames );
5529
5533
STACKLESS_ASSERT ();
5530
- } else {
5531
- x = do_call (func , pp_stack , nargs , names );
5534
+ }
5535
+ else {
5536
+ x = _PyObject_FastCallKeywords (func , stack , nargs , kwnames );
5532
5537
}
5533
5538
READ_TIMESTAMP (* pintr1 );
5534
5539
@@ -5561,8 +5566,8 @@ call_function(PyObject ***pp_stack, Py_ssize_t oparg, PyObject *names
5561
5566
*/
5562
5567
5563
5568
static PyObject *
5564
- _PyFunction_FastCallNoKw (PyCodeObject * co , PyObject * * args , Py_ssize_t nargs ,
5565
- PyObject * globals )
5569
+ _PyFunction_FastCall (PyCodeObject * co , PyObject * * args , Py_ssize_t nargs ,
5570
+ PyObject * globals )
5566
5571
{
5567
5572
STACKLESS_GETARG ();
5568
5573
PyFrameObject * f ;
@@ -5621,19 +5626,19 @@ _PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t nargs,
5621
5626
return result ;
5622
5627
}
5623
5628
5624
- /* Similar to _PyFunction_FastCall() but keywords are passed a (key, value)
5625
- pairs in stack */
5626
5629
static PyObject *
5627
- fast_function (PyObject * func , PyObject * * * pp_stack , Py_ssize_t nargs , PyObject * names )
5630
+ fast_function (PyObject * func , PyObject * * stack ,
5631
+ Py_ssize_t nargs , PyObject * kwnames )
5628
5632
{
5629
5633
PyCodeObject * co = (PyCodeObject * )PyFunction_GET_CODE (func );
5630
5634
PyObject * globals = PyFunction_GET_GLOBALS (func );
5631
5635
PyObject * argdefs = PyFunction_GET_DEFAULTS (func );
5632
5636
PyObject * kwdefs , * closure , * name , * qualname ;
5633
5637
PyObject * * d ;
5634
- Py_ssize_t nkwargs = names == NULL ? 0 : PyTuple_GET_SIZE (names );
5638
+ Py_ssize_t nkwargs = ( kwnames == NULL ) ? 0 : PyTuple_GET_SIZE (kwnames );
5635
5639
Py_ssize_t nd ;
5636
- PyObject * * stack = (* pp_stack )- nargs - nkwargs ;
5640
+
5641
+ assert ((nargs == 0 && nkwargs == 0 ) || stack != NULL );
5637
5642
5638
5643
PCALL (PCALL_FUNCTION );
5639
5644
PCALL (PCALL_FAST_FUNCTION );
@@ -5642,15 +5647,14 @@ fast_function(PyObject *func, PyObject ***pp_stack, Py_ssize_t nargs, PyObject *
5642
5647
(co -> co_flags & (~PyCF_MASK )) == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE ))
5643
5648
{
5644
5649
if (argdefs == NULL && co -> co_argcount == nargs ) {
5645
- return _PyFunction_FastCallNoKw (co , stack , nargs , globals );
5650
+ return _PyFunction_FastCall (co , stack , nargs , globals );
5646
5651
}
5647
5652
else if (nargs == 0 && argdefs != NULL
5648
5653
&& co -> co_argcount == Py_SIZE (argdefs )) {
5649
5654
/* function called with no arguments, but all parameters have
5650
5655
a default value: use default values as arguments .*/
5651
5656
stack = & PyTuple_GET_ITEM (argdefs , 0 );
5652
- return _PyFunction_FastCallNoKw (co , stack , Py_SIZE (argdefs ),
5653
- globals );
5657
+ return _PyFunction_FastCall (co , stack , Py_SIZE (argdefs ), globals );
5654
5658
}
5655
5659
}
5656
5660
@@ -5670,11 +5674,18 @@ fast_function(PyObject *func, PyObject ***pp_stack, Py_ssize_t nargs, PyObject *
5670
5674
return _PyEval_EvalCodeWithName ((PyObject * )co , globals , (PyObject * )NULL ,
5671
5675
stack , nargs ,
5672
5676
NULL , 0 ,
5673
- names , stack + nargs ,
5677
+ kwnames , stack + nargs ,
5674
5678
d , (int )nd , kwdefs ,
5675
5679
closure , name , qualname );
5676
5680
}
5677
5681
5682
+ PyObject *
5683
+ _PyFunction_FastCallKeywords (PyObject * func , PyObject * * stack ,
5684
+ Py_ssize_t nargs , PyObject * kwnames )
5685
+ {
5686
+ return fast_function (func , stack , nargs , kwnames );
5687
+ }
5688
+
5678
5689
PyObject *
5679
5690
_PyFunction_FastCallDict (PyObject * func , PyObject * * args , Py_ssize_t nargs ,
5680
5691
PyObject * kwargs )
@@ -5704,7 +5715,7 @@ _PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs,
5704
5715
/* Fast paths */
5705
5716
if (argdefs == NULL && co -> co_argcount == nargs ) {
5706
5717
STACKLESS_PROMOTE_ALL ();
5707
- result = _PyFunction_FastCallNoKw (co , args , nargs , globals );
5718
+ result = _PyFunction_FastCall (co , args , nargs , globals );
5708
5719
STACKLESS_ASSERT ();
5709
5720
return result ;
5710
5721
}
@@ -5714,8 +5725,7 @@ _PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs,
5714
5725
a default value: use default values as arguments .*/
5715
5726
args = & PyTuple_GET_ITEM (argdefs , 0 );
5716
5727
STACKLESS_PROMOTE_ALL ();
5717
- result = _PyFunction_FastCallNoKw (co , args , Py_SIZE (argdefs ),
5718
- globals );
5728
+ result = _PyFunction_FastCall (co , args , Py_SIZE (argdefs ), globals );
5719
5729
STACKLESS_ASSERT ();
5720
5730
return result ;
5721
5731
}
@@ -5781,8 +5791,8 @@ create_keyword_args(PyObject *names, PyObject ***pp_stack,
5781
5791
return NULL ;
5782
5792
while (-- nk >= 0 ) {
5783
5793
int err ;
5784
- PyObject * value = EXT_POP (* pp_stack );
5785
5794
PyObject * key = PyTuple_GET_ITEM (names , nk );
5795
+ PyObject * value = EXT_POP (* pp_stack );
5786
5796
if (PyDict_GetItem (kwdict , key ) != NULL ) {
5787
5797
PyErr_Format (PyExc_TypeError ,
5788
5798
"%.200s%s got multiple values "
@@ -5820,33 +5830,6 @@ load_args(PyObject ***pp_stack, Py_ssize_t nargs)
5820
5830
return args ;
5821
5831
}
5822
5832
5823
- static PyObject *
5824
- do_call (PyObject * func , PyObject * * * pp_stack , Py_ssize_t nargs , PyObject * kwnames )
5825
- {
5826
- PyObject * callargs , * kwdict , * result ;
5827
-
5828
- if (kwnames != NULL ) {
5829
- kwdict = create_keyword_args (kwnames , pp_stack , func );
5830
- if (kwdict == NULL ) {
5831
- return NULL ;
5832
- }
5833
- }
5834
- else {
5835
- kwdict = NULL ;
5836
- }
5837
-
5838
- callargs = load_args (pp_stack , nargs );
5839
- if (callargs == NULL ) {
5840
- Py_XDECREF (kwdict );
5841
- return NULL ;
5842
- }
5843
-
5844
- result = do_call_core (func , callargs , kwdict );
5845
- Py_XDECREF (callargs );
5846
- Py_XDECREF (kwdict );
5847
- return result ;
5848
- }
5849
-
5850
5833
static PyObject *
5851
5834
do_call_core (PyObject * func , PyObject * callargs , PyObject * kwdict )
5852
5835
{
0 commit comments