@@ -302,13 +302,12 @@ PyCFunction_Call(PyObject *callable, PyObject *args, PyObject *kwargs)
302302/* --- PyFunction call functions ---------------------------------- */
303303
304304static PyObject * _Py_HOT_FUNCTION
305- function_code_fastcall (PyCodeObject * co , PyObject * const * args , Py_ssize_t nargs ,
305+ function_code_fastcall (PyThreadState * tstate , PyCodeObject * co ,
306+ PyObject * const * args , Py_ssize_t nargs ,
306307 PyObject * globals )
307308{
308- assert (globals != NULL );
309-
310- PyThreadState * tstate = _PyThreadState_GET ();
311309 assert (tstate != NULL );
310+ assert (globals != NULL );
312311
313312 /* XXX Perhaps we should create a specialized
314313 _PyFrame_New_NoTrack() that doesn't take locals, but does
@@ -344,57 +343,61 @@ PyObject *
344343_PyFunction_Vectorcall (PyObject * func , PyObject * const * stack ,
345344 size_t nargsf , PyObject * kwnames )
346345{
347- PyCodeObject * co = (PyCodeObject * )PyFunction_GET_CODE (func );
348- PyObject * globals = PyFunction_GET_GLOBALS (func );
349- PyObject * argdefs = PyFunction_GET_DEFAULTS (func );
350- PyObject * kwdefs , * closure , * name , * qualname ;
351- PyObject * * d ;
352- Py_ssize_t nkwargs = (kwnames == NULL ) ? 0 : PyTuple_GET_SIZE (kwnames );
353- Py_ssize_t nd ;
354-
355346 assert (PyFunction_Check (func ));
347+ assert (kwnames == NULL || PyTuple_CheckExact (kwnames ));
348+
356349 Py_ssize_t nargs = PyVectorcall_NARGS (nargsf );
357350 assert (nargs >= 0 );
358- assert (kwnames == NULL || PyTuple_CheckExact (kwnames ) );
351+ Py_ssize_t nkwargs = (kwnames == NULL ) ? 0 : PyTuple_GET_SIZE (kwnames );
359352 assert ((nargs == 0 && nkwargs == 0 ) || stack != NULL );
360353 /* kwnames must only contain strings and all keys must be unique */
361354
355+ PyThreadState * tstate = _PyThreadState_GET ();
356+ PyCodeObject * co = (PyCodeObject * )PyFunction_GET_CODE (func );
357+ PyObject * globals = PyFunction_GET_GLOBALS (func );
358+ PyObject * argdefs = PyFunction_GET_DEFAULTS (func );
359+
362360 if (co -> co_kwonlyargcount == 0 && nkwargs == 0 &&
363361 (co -> co_flags & ~PyCF_MASK ) == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE ))
364362 {
365363 if (argdefs == NULL && co -> co_argcount == nargs ) {
366- return function_code_fastcall (co , stack , nargs , globals );
364+ return function_code_fastcall (tstate , co , stack , nargs , globals );
367365 }
368366 else if (nargs == 0 && argdefs != NULL
369367 && co -> co_argcount == PyTuple_GET_SIZE (argdefs )) {
370368 /* function called with no arguments, but all parameters have
371369 a default value: use default values as arguments .*/
372370 stack = _PyTuple_ITEMS (argdefs );
373- return function_code_fastcall (co , stack , PyTuple_GET_SIZE (argdefs ),
371+ return function_code_fastcall (tstate , co ,
372+ stack , PyTuple_GET_SIZE (argdefs ),
374373 globals );
375374 }
376375 }
377376
378- kwdefs = PyFunction_GET_KW_DEFAULTS (func );
379- closure = PyFunction_GET_CLOSURE (func );
380- name = ((PyFunctionObject * )func ) -> func_name ;
381- qualname = ((PyFunctionObject * )func ) -> func_qualname ;
377+ PyObject * kwdefs = PyFunction_GET_KW_DEFAULTS (func );
378+ PyObject * closure = PyFunction_GET_CLOSURE (func );
379+ PyObject * name = ((PyFunctionObject * )func ) -> func_name ;
380+ PyObject * qualname = ((PyFunctionObject * )func ) -> func_qualname ;
382381
382+ PyObject * * d ;
383+ Py_ssize_t nd ;
383384 if (argdefs != NULL ) {
384385 d = _PyTuple_ITEMS (argdefs );
385386 nd = PyTuple_GET_SIZE (argdefs );
387+ assert (nd <= INT_MAX );
386388 }
387389 else {
388390 d = NULL ;
389391 nd = 0 ;
390392 }
391- return _PyEval_EvalCodeWithName ((PyObject * )co , globals , (PyObject * )NULL ,
392- stack , nargs ,
393- nkwargs ? _PyTuple_ITEMS (kwnames ) : NULL ,
394- stack + nargs ,
395- nkwargs , 1 ,
396- d , (int )nd , kwdefs ,
397- closure , name , qualname );
393+ return _PyEval_EvalCode (tstate ,
394+ (PyObject * )co , globals , (PyObject * )NULL ,
395+ stack , nargs ,
396+ nkwargs ? _PyTuple_ITEMS (kwnames ) : NULL ,
397+ stack + nargs ,
398+ nkwargs , 1 ,
399+ d , (int )nd , kwdefs ,
400+ closure , name , qualname );
398401}
399402
400403
0 commit comments