From: Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com> Date: Wed, 9 Feb 2022 16:52:42 +0000 (+0530) Subject: bpo-46430: Intern strings in deep-frozen modules (GH-30683) X-Git-Tag: v3.11.0a6~260 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c0a5ebeb1239020f2ecc199053bb1a70d78841a1;p=thirdparty%2FPython%2Fcpython.git bpo-46430: Intern strings in deep-frozen modules (GH-30683) --- diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h index 3897ea0ab6a1..2d8fe20e1a6f 100644 --- a/Include/internal/pycore_code.h +++ b/Include/internal/pycore_code.h @@ -279,6 +279,8 @@ void _Py_Specialize_CompareOp(PyObject *lhs, PyObject *rhs, _Py_CODEUNIT *instr, /* Deallocator function for static codeobjects used in deepfreeze.py */ void _PyStaticCode_Dealloc(PyCodeObject *co); +/* Function to intern strings of codeobjects */ +void _PyStaticCode_InternStrings(PyCodeObject *co); #ifdef Py_STATS diff --git a/Misc/NEWS.d/next/Build/2022-01-19-11-08-32.bpo-46430.k403m_.rst b/Misc/NEWS.d/next/Build/2022-01-19-11-08-32.bpo-46430.k403m_.rst new file mode 100644 index 000000000000..2929c5187e1d --- /dev/null +++ b/Misc/NEWS.d/next/Build/2022-01-19-11-08-32.bpo-46430.k403m_.rst @@ -0,0 +1 @@ +Intern strings in deep-frozen modules. Patch by Kumar Aditya. \ No newline at end of file diff --git a/Objects/codeobject.c b/Objects/codeobject.c index bb8ffa794a96..efb51464bd87 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -1924,3 +1924,15 @@ _PyStaticCode_Dealloc(PyCodeObject *co) co->co_weakreflist = NULL; } } + +void +_PyStaticCode_InternStrings(PyCodeObject *co) +{ + int res = intern_strings(co->co_names); + assert(res == 0); + res = intern_string_constants(co->co_consts, NULL); + assert(res == 0); + res = intern_strings(co->co_localsplusnames); + assert(res == 0); + (void)res; +} diff --git a/Tools/scripts/deepfreeze.py b/Tools/scripts/deepfreeze.py index 080980f6d0ae..0edf3af71d99 100644 --- a/Tools/scripts/deepfreeze.py +++ b/Tools/scripts/deepfreeze.py @@ -279,6 +279,7 @@ class Printer: self.write(f".co_cellvars = {co_cellvars},") self.write(f".co_freevars = {co_freevars},") self.deallocs.append(f"_PyStaticCode_Dealloc(&{name});") + self.patchups.append(f"_PyStaticCode_InternStrings(&{name});") return f"& {name}.ob_base" def generate_tuple(self, name: str, t: Tuple[object, ...]) -> str: