@@ -448,15 +448,19 @@ future_schedule_callbacks(FutureObj *fut)
448448
449449 for (i = 0 ; i < len ; i ++ ) {
450450 PyObject * cb_tup = PyList_GET_ITEM (fut -> fut_callbacks , i );
451- PyObject * cb = PyTuple_GET_ITEM (cb_tup , 0 );
452- PyObject * ctx = PyTuple_GET_ITEM (cb_tup , 1 );
451+ PyObject * cb = PyTuple_GetItemRef (cb_tup , 0 );
452+ PyObject * ctx = PyTuple_GetItemRef (cb_tup , 1 );
453453
454454 if (call_soon (fut -> fut_loop , cb , (PyObject * )fut , (PyContext * )ctx )) {
455+ Py_DECREF (cb );
456+ Py_DECREF (ctx );
455457 /* If an error occurs in pure-Python implementation,
456458 all callbacks are cleared. */
457459 Py_CLEAR (fut -> fut_callbacks );
458460 return -1 ;
459461 }
462+ Py_DECREF (cb );
463+ Py_DECREF (ctx );
460464 }
461465
462466 Py_CLEAR (fut -> fut_callbacks );
@@ -666,10 +670,8 @@ future_add_done_callback(FutureObj *fut, PyObject *arg, PyContext *ctx)
666670 if (tup == NULL ) {
667671 return NULL ;
668672 }
669- Py_INCREF (arg );
670- PyTuple_SET_ITEM (tup , 0 , arg );
671- Py_INCREF (ctx );
672- PyTuple_SET_ITEM (tup , 1 , (PyObject * )ctx );
673+ PyTuple_SetItemRef (tup , 0 , arg );
674+ PyTuple_SetItemRef (tup , 1 , (PyObject * )ctx );
673675
674676 if (fut -> fut_callbacks != NULL ) {
675677 int err = PyList_Append (fut -> fut_callbacks , tup );
@@ -964,8 +966,9 @@ _asyncio_Future_remove_done_callback(FutureObj *self, PyObject *fn)
964966
965967 if (len == 1 ) {
966968 PyObject * cb_tup = PyList_GET_ITEM (self -> fut_callbacks , 0 );
967- int cmp = PyObject_RichCompareBool (
968- fn , PyTuple_GET_ITEM (cb_tup , 0 ), Py_EQ );
969+ PyObject * arg = PyTuple_GetItemRef (cb_tup , 0 );
970+ int cmp = PyObject_RichCompareBool (fn , arg , Py_EQ );
971+ Py_DECREF (arg );
969972 if (cmp == -1 ) {
970973 return NULL ;
971974 }
@@ -987,7 +990,9 @@ _asyncio_Future_remove_done_callback(FutureObj *self, PyObject *fn)
987990 int ret ;
988991 PyObject * item = PyList_GET_ITEM (self -> fut_callbacks , i );
989992 Py_INCREF (item );
990- ret = PyObject_RichCompareBool (fn , PyTuple_GET_ITEM (item , 0 ), Py_EQ );
993+ PyObject * arg = PyTuple_GetItemRef (item , 0 );
994+ ret = PyObject_RichCompareBool (fn , arg , Py_EQ );
995+ Py_DECREF (arg );
991996 if (ret == 0 ) {
992997 if (j < len ) {
993998 PyList_SET_ITEM (newlist , j , item );
@@ -1194,11 +1199,9 @@ FutureObj_get_callbacks(FutureObj *fut)
11941199 return NULL ;
11951200 }
11961201
1197- Py_INCREF (fut -> fut_callback0 );
1198- PyTuple_SET_ITEM (tup0 , 0 , fut -> fut_callback0 );
1202+ PyTuple_SetItemRef (tup0 , 0 , fut -> fut_callback0 );
11991203 assert (fut -> fut_context0 != NULL );
1200- Py_INCREF (fut -> fut_context0 );
1201- PyTuple_SET_ITEM (tup0 , 1 , (PyObject * )fut -> fut_context0 );
1204+ PyTuple_SetItemRef (tup0 , 1 , (PyObject * )fut -> fut_context0 );
12021205
12031206 PyList_SET_ITEM (new_list , 0 , tup0 );
12041207
@@ -3286,7 +3289,8 @@ module_init(void)
32863289 if (context_str == NULL ) {
32873290 goto fail ;
32883291 }
3289- PyTuple_SET_ITEM (context_kwname , 0 , context_str );
3292+ PyTuple_SetItemRef (context_kwname , 0 , context_str );
3293+ Py_DECREF (context_str );
32903294
32913295#define WITH_MOD (NAME ) \
32923296 Py_CLEAR(module); \
0 commit comments