[3.6] bpo-31787: Prevent refleaks when calling __init__() more than once (GH-3995) by methane · Pull Request #5659 · python/cpython
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) {
res = _PyObject_CallMethodId(fut->fut_loop, &PyId_get_debug, NULL); if (res == NULL) {
Py_XSETREF(fut->fut_callbacks, PyList_New(0)); fut->fut_callbacks = PyList_New(0); if (fut->fut_callbacks == NULL) { 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;