@@ -567,6 +567,9 @@ ga_richcompare(PyObject *a, PyObject *b, int op)
567567
568568 gaobject * aa = (gaobject * )a ;
569569 gaobject * bb = (gaobject * )b ;
570+ if (aa -> starred != bb -> starred ) {
571+ Py_RETURN_FALSE ;
572+ }
570573 int eq = PyObject_RichCompareBool (aa -> origin , bb -> origin , Py_EQ );
571574 if (eq < 0 ) {
572575 return NULL ;
@@ -604,6 +607,16 @@ static PyObject *
604607ga_reduce (PyObject * self , PyObject * Py_UNUSED (ignored ))
605608{
606609 gaobject * alias = (gaobject * )self ;
610+ if (alias -> starred ) {
611+ PyObject * tmp = Py_GenericAlias (alias -> origin , alias -> args );
612+ if (tmp != NULL ) {
613+ Py_SETREF (tmp , PyObject_GetIter (tmp ));
614+ }
615+ if (tmp == NULL ) {
616+ return NULL ;
617+ }
618+ return Py_BuildValue ("N(N)" , _PyEval_GetBuiltin (& _Py_ID (next )), tmp );
619+ }
607620 return Py_BuildValue ("O(OO)" , Py_TYPE (alias ),
608621 alias -> origin , alias -> args );
609622}
@@ -775,6 +788,18 @@ ga_iter_clear(PyObject *self) {
775788 return 0 ;
776789}
777790
791+ static PyObject *
792+ ga_iter_reduce (PyObject * self , PyObject * Py_UNUSED (ignored ))
793+ {
794+ gaiterobject * gi = (gaiterobject * )self ;
795+ return Py_BuildValue ("N(O)" , _PyEval_GetBuiltin (& _Py_ID (iter )), gi -> obj );
796+ }
797+
798+ static PyMethodDef ga_iter_methods [] = {
799+ {"__reduce__" , ga_iter_reduce , METH_NOARGS },
800+ {0 }
801+ };
802+
778803// gh-91632: _Py_GenericAliasIterType is exported to be cleared
779804// in _PyTypes_FiniTypes.
780805PyTypeObject _Py_GenericAliasIterType = {
@@ -784,6 +809,7 @@ PyTypeObject _Py_GenericAliasIterType = {
784809 .tp_iter = PyObject_SelfIter ,
785810 .tp_iternext = (iternextfunc )ga_iternext ,
786811 .tp_traverse = (traverseproc )ga_iter_traverse ,
812+ .tp_methods = ga_iter_methods ,
787813 .tp_dealloc = (destructor )ga_iter_dealloc ,
788814 .tp_clear = (inquiry )ga_iter_clear ,
789815 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC ,
0 commit comments