@@ -459,9 +459,11 @@ partial_vectorcall(partialobject *pto, PyObject *const *args,
459459 }
460460
461461 /* Calculate total kw size and positions of items to override */
462- Py_ssize_t * positions , small_positions [_PY_FASTCALL_SMALL_STACK ];
462+ PyObject * tot_kwnames ;
463+ PyObject * * stack , * small_stack [_PY_FASTCALL_SMALL_STACK ];
463464 tot_nkwds = pto_nkwds + nkwds ;
464465 if (nkwds ) {
466+ Py_ssize_t * positions , small_positions [_PY_FASTCALL_SMALL_STACK ];
465467 ALLOCATE_STACK (Py_ssize_t , nkwds , small_positions , positions );
466468 for (Py_ssize_t i = 0 ; i < nkwds ; i ++ ) {
467469 positions [i ] = -1 ;
@@ -476,12 +478,61 @@ partial_vectorcall(partialobject *pto, PyObject *const *args,
476478 }
477479 }
478480 }
481+ tot_nargskw = tot_nargs + tot_nkwds ;
482+
483+ /* Allocate Stack */
484+ ALLOCATE_STACK (PyObject , tot_nargskw , small_stack , stack );
485+
486+ /* Copy Pto Keywords to stack */
487+ memcpy (stack + tot_nargs , pto_kwvals , pto_nkwds * sizeof (PyObject * ));
488+ DEALLOCATE_STACK (small_pto_kwvals , pto_kwvals );
489+
490+ /* Copy New Keywords to stack */
491+ tot_kwnames = PyTuple_New (tot_nkwds );
492+ for (Py_ssize_t i = 0 ; i < pto_nkwds ; i ++ ) {
493+ key = pto_kwkeys [i ];
494+ PyTuple_SET_ITEM (tot_kwnames , i , key );
495+ Py_INCREF (key );
496+ }
497+ DEALLOCATE_STACK (small_pto_kwkeys , pto_kwkeys );
498+
499+ Py_ssize_t k = 0 ;
500+ Py_ssize_t j ;
501+ for (Py_ssize_t i = 0 ; i < nkwds ; i ++ ) {
502+ key = PyTuple_GET_ITEM (kwnames , i );
503+ val = args [nargs + i ];
504+ j = positions [i ];
505+ if (j != -1 ) {
506+ stack [tot_nargs + j ] = val ;
507+ }
508+ else {
509+ PyTuple_SET_ITEM (tot_kwnames , pto_nkwds + k , key );
510+ Py_INCREF (key );
511+ stack [tot_nargs + pto_nkwds + k ] = val ;
512+ k ++ ;
513+ }
514+ }
515+ DEALLOCATE_STACK (small_positions , positions );
479516 }
480- tot_nargskw = tot_nargs + tot_nkwds ;
517+ else {
518+ tot_nargskw = tot_nargs + tot_nkwds ;
481519
482- /* Allocate Stack */
483- PyObject * * stack , * small_stack [_PY_FASTCALL_SMALL_STACK ];
484- ALLOCATE_STACK (PyObject , tot_nargskw , small_stack , stack );
520+ /* Allocate Stack */
521+ ALLOCATE_STACK (PyObject , tot_nargskw , small_stack , stack );
522+
523+ /* Copy Pto Keywords to stack */
524+ memcpy (stack + tot_nargs , pto_kwvals , pto_nkwds * sizeof (PyObject * ));
525+ DEALLOCATE_STACK (small_pto_kwvals , pto_kwvals );
526+
527+ /* Copy New Keywords to stack */
528+ tot_kwnames = PyTuple_New (tot_nkwds );
529+ for (Py_ssize_t i = 0 ; i < pto_nkwds ; i ++ ) {
530+ key = pto_kwkeys [i ];
531+ PyTuple_SET_ITEM (tot_kwnames , i , key );
532+ Py_INCREF (key );
533+ }
534+ DEALLOCATE_STACK (small_pto_kwkeys , pto_kwkeys );
535+ }
485536
486537 /* Copy Positionals to stack */
487538 if (pto_phcount ) {
@@ -506,39 +557,6 @@ partial_vectorcall(partialobject *pto, PyObject *const *args,
506557 memcpy (stack + pto_nargs , args , nargs * sizeof (PyObject * ));
507558 }
508559
509- /* Copy Pto Keywords to stack */
510- memcpy (stack + tot_nargs , pto_kwvals , pto_nkwds * sizeof (PyObject * ));
511- DEALLOCATE_STACK (small_pto_kwvals , pto_kwvals );
512-
513- /* Copy New Keywords to stack */
514- PyObject * tot_kwnames = PyTuple_New (tot_nkwds );
515- for (Py_ssize_t i = 0 ; i < pto_nkwds ; i ++ ) {
516- key = pto_kwkeys [i ];
517- PyTuple_SET_ITEM (tot_kwnames , i , key );
518- Py_INCREF (key );
519- }
520- DEALLOCATE_STACK (small_pto_kwkeys , pto_kwkeys );
521-
522- if (nkwds ) {
523- Py_ssize_t k = 0 ;
524- Py_ssize_t j ;
525- for (Py_ssize_t i = 0 ; i < nkwds ; i ++ ) {
526- key = PyTuple_GET_ITEM (kwnames , i );
527- val = args [nargs + i ];
528- j = positions [i ];
529- if (j != -1 ) {
530- stack [tot_nargs + j ] = val ;
531- }
532- else {
533- PyTuple_SET_ITEM (tot_kwnames , pto_nkwds + k , key );
534- Py_INCREF (key );
535- stack [tot_nargs + pto_nkwds + k ] = val ;
536- k ++ ;
537- }
538- }
539- DEALLOCATE_STACK (small_positions , positions );
540- }
541-
542560 /* Call / Maintenance / Return */
543561 ret = _PyObject_VectorcallTstate (tstate , pto -> fn , stack , tot_nargs , tot_kwnames );
544562 DEALLOCATE_STACK (small_stack , stack );
0 commit comments