mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
Issue #27942: String constants now interned recursively in tuples and frozensets.
This commit is contained in:
parent
55f3ae68bb
commit
00a0fc1144
5 changed files with 953 additions and 877 deletions
|
@ -46,6 +46,50 @@ intern_strings(PyObject *tuple)
|
|||
}
|
||||
}
|
||||
|
||||
/* Intern selected string constants */
|
||||
static int
|
||||
intern_string_constants(PyObject *tuple)
|
||||
{
|
||||
int modified = 0;
|
||||
Py_ssize_t i;
|
||||
|
||||
for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
|
||||
PyObject *v = PyTuple_GET_ITEM(tuple, i);
|
||||
if (PyUnicode_CheckExact(v)) {
|
||||
if (all_name_chars(v)) {
|
||||
PyObject *w = v;
|
||||
PyUnicode_InternInPlace(&v);
|
||||
if (w != v) {
|
||||
PyTuple_SET_ITEM(tuple, i, v);
|
||||
modified = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (PyTuple_CheckExact(v)) {
|
||||
intern_string_constants(v);
|
||||
}
|
||||
else if (PyFrozenSet_CheckExact(v)) {
|
||||
PyObject *tmp = PySequence_Tuple(v);
|
||||
if (tmp == NULL) {
|
||||
PyErr_Clear();
|
||||
continue;
|
||||
}
|
||||
if (intern_string_constants(tmp)) {
|
||||
v = PyFrozenSet_New(tmp);
|
||||
if (v == NULL) {
|
||||
PyErr_Clear();
|
||||
}
|
||||
else {
|
||||
PyTuple_SET_ITEM(tuple, i, v);
|
||||
modified = 1;
|
||||
}
|
||||
}
|
||||
Py_DECREF(tmp);
|
||||
}
|
||||
}
|
||||
return modified;
|
||||
}
|
||||
|
||||
|
||||
PyCodeObject *
|
||||
PyCode_New(int argcount, int kwonlyargcount,
|
||||
|
@ -84,13 +128,7 @@ PyCode_New(int argcount, int kwonlyargcount,
|
|||
intern_strings(varnames);
|
||||
intern_strings(freevars);
|
||||
intern_strings(cellvars);
|
||||
/* Intern selected string constants */
|
||||
for (i = PyTuple_GET_SIZE(consts); --i >= 0; ) {
|
||||
PyObject *v = PyTuple_GetItem(consts, i);
|
||||
if (!all_name_chars(v))
|
||||
continue;
|
||||
PyUnicode_InternInPlace(&PyTuple_GET_ITEM(consts, i));
|
||||
}
|
||||
intern_string_constants(consts);
|
||||
/* 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