Skip to content

Commit b0f96d7

Browse files
fix callbacks to copy it always
1 parent b61fece commit b0f96d7

File tree

1 file changed

+25
-28
lines changed

1 file changed

+25
-28
lines changed

Modules/_asynciomodule.c

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1265,52 +1265,49 @@ static PyObject *
12651265
FutureObj_get_callbacks(FutureObj *fut, void *Py_UNUSED(ignored))
12661266
{
12671267
asyncio_state *state = get_asyncio_state_by_def((PyObject *)fut);
1268-
Py_ssize_t i;
1269-
12701268
ENSURE_FUTURE_ALIVE(state, fut)
12711269

1272-
if (fut->fut_callback0 == NULL) {
1273-
if (fut->fut_callbacks == NULL) {
1274-
Py_RETURN_NONE;
1275-
}
1276-
1277-
return Py_NewRef(fut->fut_callbacks);
1270+
if (fut->fut_callback0 == NULL && fut->fut_callbacks == NULL) {
1271+
Py_RETURN_NONE;
12781272
}
12791273

1280-
Py_ssize_t len = 1;
1274+
Py_ssize_t len = 0;
1275+
if (fut->fut_callback0 != NULL) {
1276+
len++;
1277+
}
12811278
if (fut->fut_callbacks != NULL) {
12821279
len += PyList_GET_SIZE(fut->fut_callbacks);
12831280
}
12841281

1285-
1286-
PyObject *new_list = PyList_New(len);
1287-
if (new_list == NULL) {
1282+
PyObject *callbacks = PyList_New(len);
1283+
if (callbacks == NULL) {
12881284
return NULL;
12891285
}
12901286

1291-
PyObject *tup0 = PyTuple_New(2);
1292-
if (tup0 == NULL) {
1293-
Py_DECREF(new_list);
1294-
return NULL;
1287+
Py_ssize_t i = 0;
1288+
if (fut->fut_callback0 != NULL) {
1289+
PyObject *tup0 = PyTuple_New(2);
1290+
if (tup0 == NULL) {
1291+
Py_DECREF(callbacks);
1292+
return NULL;
1293+
}
1294+
PyTuple_SET_ITEM(tup0, 0, Py_NewRef(fut->fut_callback0));
1295+
assert(fut->fut_context0 != NULL);
1296+
PyTuple_SET_ITEM(tup0, 1, Py_NewRef(fut->fut_context0));
1297+
PyList_SET_ITEM(callbacks, i, tup0);
1298+
i++;
12951299
}
12961300

1297-
Py_INCREF(fut->fut_callback0);
1298-
PyTuple_SET_ITEM(tup0, 0, fut->fut_callback0);
1299-
assert(fut->fut_context0 != NULL);
1300-
Py_INCREF(fut->fut_context0);
1301-
PyTuple_SET_ITEM(tup0, 1, (PyObject *)fut->fut_context0);
1302-
1303-
PyList_SET_ITEM(new_list, 0, tup0);
1304-
13051301
if (fut->fut_callbacks != NULL) {
1306-
for (i = 0; i < PyList_GET_SIZE(fut->fut_callbacks); i++) {
1307-
PyObject *cb = PyList_GET_ITEM(fut->fut_callbacks, i);
1302+
for (int j = 0; i < PyList_GET_SIZE(fut->fut_callbacks); j++) {
1303+
PyObject *cb = PyList_GET_ITEM(fut->fut_callbacks, j);
13081304
Py_INCREF(cb);
1309-
PyList_SET_ITEM(new_list, i + 1, cb);
1305+
PyList_SET_ITEM(callbacks, i, cb);
1306+
i++;
13101307
}
13111308
}
13121309

1313-
return new_list;
1310+
return callbacks;
13141311
}
13151312

13161313
static PyObject *

0 commit comments

Comments
 (0)