@@ -71,10 +71,37 @@ groupby_traverse(groupbyobject *gbo, visitproc visit, void *arg)
7171 return 0 ;
7272}
7373
74+ Py_LOCAL_INLINE (int )
75+ groupby_step (groupbyobject * gbo )
76+ {
77+ PyObject * newvalue , * newkey , * oldvalue ;
78+
79+ newvalue = PyIter_Next (gbo -> it );
80+ if (newvalue == NULL )
81+ return -1 ;
82+
83+ if (gbo -> keyfunc == Py_None ) {
84+ newkey = newvalue ;
85+ Py_INCREF (newvalue );
86+ } else {
87+ newkey = PyObject_CallFunctionObjArgs (gbo -> keyfunc , newvalue , NULL );
88+ if (newkey == NULL ) {
89+ Py_DECREF (newvalue );
90+ return -1 ;
91+ }
92+ }
93+
94+ oldvalue = gbo -> currvalue ;
95+ gbo -> currvalue = newvalue ;
96+ Py_XSETREF (gbo -> currkey , newkey );
97+ Py_XDECREF (oldvalue );
98+ return 0 ;
99+ }
100+
74101static PyObject *
75102groupby_next (groupbyobject * gbo )
76103{
77- PyObject * newvalue , * newkey , * r , * grouper , * tmp ;
104+ PyObject * r , * grouper ;
78105
79106 /* skip to next iteration group */
80107 for (;;) {
@@ -93,35 +120,11 @@ groupby_next(groupbyobject *gbo)
93120 break ;
94121 }
95122
96- newvalue = PyIter_Next (gbo -> it );
97- if (newvalue == NULL )
123+ if (groupby_step (gbo ) < 0 )
98124 return NULL ;
99-
100- if (gbo -> keyfunc == Py_None ) {
101- newkey = newvalue ;
102- Py_INCREF (newvalue );
103- } else {
104- newkey = PyObject_CallFunctionObjArgs (gbo -> keyfunc ,
105- newvalue , NULL );
106- if (newkey == NULL ) {
107- Py_DECREF (newvalue );
108- return NULL ;
109- }
110- }
111-
112- tmp = gbo -> currkey ;
113- gbo -> currkey = newkey ;
114- Py_XDECREF (tmp );
115-
116- tmp = gbo -> currvalue ;
117- gbo -> currvalue = newvalue ;
118- Py_XDECREF (tmp );
119125 }
120-
121126 Py_INCREF (gbo -> currkey );
122- tmp = gbo -> tgtkey ;
123- gbo -> tgtkey = gbo -> currkey ;
124- Py_XDECREF (tmp );
127+ Py_XSETREF (gbo -> tgtkey , gbo -> currkey );
125128
126129 grouper = _grouper_create (gbo , gbo -> tgtkey );
127130 if (grouper == NULL )
@@ -229,29 +232,12 @@ static PyObject *
229232_grouper_next (_grouperobject * igo )
230233{
231234 groupbyobject * gbo = (groupbyobject * )igo -> parent ;
232- PyObject * newvalue , * newkey , * r ;
235+ PyObject * r ;
233236 int rcmp ;
234237
235238 if (gbo -> currvalue == NULL ) {
236- newvalue = PyIter_Next (gbo -> it );
237- if (newvalue == NULL )
239+ if (groupby_step (gbo ) < 0 )
238240 return NULL ;
239-
240- if (gbo -> keyfunc == Py_None ) {
241- newkey = newvalue ;
242- Py_INCREF (newvalue );
243- } else {
244- newkey = PyObject_CallFunctionObjArgs (gbo -> keyfunc ,
245- newvalue , NULL );
246- if (newkey == NULL ) {
247- Py_DECREF (newvalue );
248- return NULL ;
249- }
250- }
251-
252- assert (gbo -> currkey == NULL );
253- gbo -> currkey = newkey ;
254- gbo -> currvalue = newvalue ;
255241 }
256242
257243 assert (gbo -> currkey != NULL );
0 commit comments