[Python-checkins] Fix leak when an exception is raised during generator creation. (GH-29960)
pablogsal
webhook-mailer at python.org
Tue Dec 7 13:05:58 EST 2021
https://github.com/python/cpython/commit/064e53d19aea6d6906fa8f7706a2556a2c293ccd
commit: 064e53d19aea6d6906fa8f7706a2556a2c293ccd
branch: main
author: Mark Shannon <mark at hotpy.org>
committer: pablogsal <Pablogsal at gmail.com>
date: 2021-12-07T18:05:48Z
summary:
Fix leak when an exception is raised during generator creation. (GH-29960)
files:
M Python/ceval.c
diff --git a/Python/ceval.c b/Python/ceval.c
index 446772dd4f7c0..c22af02330b92 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -5852,24 +5852,6 @@ initialize_locals(PyThreadState *tstate, PyFunctionObject *func,
return -1;
}
-static int
-initialize_coro_frame(InterpreterFrame *frame, PyThreadState *tstate,
- PyFunctionObject *func, PyObject *locals,
- PyObject *const *args, Py_ssize_t argcount,
- PyObject *kwnames)
-{
- assert(is_tstate_valid(tstate));
- assert(func->func_defaults == NULL || PyTuple_CheckExact(func->func_defaults));
- PyCodeObject *code = (PyCodeObject *)func->func_code;
- _PyFrame_InitializeSpecials(frame, func, locals, code->co_nlocalsplus);
- for (int i = 0; i < code->co_nlocalsplus; i++) {
- frame->localsplus[i] = NULL;
- }
- assert(frame->frame_obj == NULL);
- return initialize_locals(tstate, func, frame->localsplus, args, argcount, kwnames);
-}
-
-
/* Consumes all the references to the args */
static PyObject *
make_coro(PyThreadState *tstate, PyFunctionObject *func,
@@ -5883,12 +5865,17 @@ make_coro(PyThreadState *tstate, PyFunctionObject *func,
return NULL;
}
InterpreterFrame *frame = (InterpreterFrame *)((PyGenObject *)gen)->gi_iframe;
- if (initialize_coro_frame(frame, tstate, func, locals, args, argcount, kwnames)) {
+ PyCodeObject *code = (PyCodeObject *)func->func_code;
+ _PyFrame_InitializeSpecials(frame, func, locals, code->co_nlocalsplus);
+ for (int i = 0; i < code->co_nlocalsplus; i++) {
+ frame->localsplus[i] = NULL;
+ }
+ ((PyGenObject *)gen)->gi_frame_valid = 1;
+ if (initialize_locals(tstate, func, frame->localsplus, args, argcount, kwnames)) {
Py_DECREF(gen);
return NULL;
}
frame->generator = gen;
- ((PyGenObject *)gen)->gi_frame_valid = 1;
return gen;
}
More information about the Python-checkins
mailing list