mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
bpo-32176: Set CO_NOFREE in the code object constructor (GH-4675)
Previously, CO_NOFREE was set in the compiler, which meant it could end up being set incorrectly when code objects were created directly. Setting it in the constructor based on freevars and cellvars ensures it is always accurate, regardless of how the code object is defined.
This commit is contained in:
parent
7324b5ce8e
commit
078f1814f1
4 changed files with 59 additions and 6 deletions
|
@ -124,12 +124,20 @@ PyCode_New(int argcount, int kwonlyargcount,
|
|||
if (PyUnicode_READY(filename) < 0)
|
||||
return NULL;
|
||||
|
||||
n_cellvars = PyTuple_GET_SIZE(cellvars);
|
||||
intern_strings(names);
|
||||
intern_strings(varnames);
|
||||
intern_strings(freevars);
|
||||
intern_strings(cellvars);
|
||||
intern_string_constants(consts);
|
||||
|
||||
/* Check for any inner or outer closure references */
|
||||
n_cellvars = PyTuple_GET_SIZE(cellvars);
|
||||
if (!n_cellvars && !PyTuple_GET_SIZE(freevars)) {
|
||||
flags |= CO_NOFREE;
|
||||
} else {
|
||||
flags &= ~CO_NOFREE;
|
||||
}
|
||||
|
||||
/* Create mapping between cells and arguments if needed. */
|
||||
if (n_cellvars) {
|
||||
Py_ssize_t total_args = argcount + kwonlyargcount +
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue