◐ Shell
clean mode source ↗

[3.6] bpo-31787: Prevent refleaks when calling __init__() more than once (GH-3995) by methane · Pull Request #5659 · python/cpython

Expand Up @@ -132,13 +132,25 @@ future_schedule_callbacks(FutureObj *fut) return 0; }

static int future_init(FutureObj *fut, PyObject *loop) { PyObject *res; int is_true; _Py_IDENTIFIER(get_debug);
// Same to FutureObj_clear() but not clearing fut->dict Py_CLEAR(fut->fut_loop); Py_CLEAR(fut->fut_callbacks); Py_CLEAR(fut->fut_result); Py_CLEAR(fut->fut_exception); Py_CLEAR(fut->fut_source_tb);
fut->fut_state = STATE_PENDING; fut->fut_log_tb = 0; fut->fut_blocking = 0;
if (loop == Py_None) { loop = _PyObject_CallNoArg(asyncio_get_event_loop); if (loop == NULL) { Expand All @@ -148,7 +160,7 @@ future_init(FutureObj *fut, PyObject *loop) else { Py_INCREF(loop); } Py_XSETREF(fut->fut_loop, loop); fut->fut_loop = loop;
res = _PyObject_CallMethodId(fut->fut_loop, &PyId_get_debug, NULL); if (res == NULL) { Expand All @@ -160,13 +172,13 @@ future_init(FutureObj *fut, PyObject *loop) return -1; } if (is_true) { Py_XSETREF(fut->fut_source_tb, _PyObject_CallNoArg(traceback_extract_stack)); fut->fut_source_tb = _PyObject_CallNoArg(traceback_extract_stack); if (fut->fut_source_tb == NULL) { return -1; } }
Py_XSETREF(fut->fut_callbacks, PyList_New(0)); fut->fut_callbacks = PyList_New(0); if (fut->fut_callbacks == NULL) { return -1; } Expand Down Expand Up @@ -1336,12 +1348,12 @@ _asyncio_Task___init___impl(TaskObj *self, PyObject *coro, PyObject *loop) return -1; }
self->task_fut_waiter = NULL; Py_CLEAR(self->task_fut_waiter); self->task_must_cancel = 0; self->task_log_destroy_pending = 1;
Py_INCREF(coro); self->task_coro = coro; Py_XSETREF(self->task_coro, coro);
if (task_call_step_soon(self, NULL)) { return -1; Expand Down