@@ -109,6 +109,7 @@ def __init__(self, file: TextIO) -> None:
109109 self .cache : Dict [tuple [type , object , str ], str ] = {}
110110 self .hits , self .misses = 0 , 0
111111 self .patchups : list [str ] = []
112+ self .deallocs : list [str ] = []
112113 self .write ('#include "Python.h"' )
113114 self .write ('#include "internal/pycore_gc.h"' )
114115 self .write ('#include "internal/pycore_code.h"' )
@@ -277,6 +278,7 @@ def generate_code(self, name: str, code: types.CodeType) -> str:
277278 self .write (f".co_varnames = { co_varnames } ," )
278279 self .write (f".co_cellvars = { co_cellvars } ," )
279280 self .write (f".co_freevars = { co_freevars } ," )
281+ self .deallocs .append (f"_PyStaticCode_Dealloc(&{ name } , (_Py_CODEUNIT *) { removesuffix (co_code , '.ob_base.ob_base' )} .ob_sval);" )
280282 return f"& { name } .ob_base"
281283
282284 def generate_tuple (self , name : str , t : Tuple [object , ...]) -> str :
@@ -440,6 +442,9 @@ def generate(args: list[str], output: TextIO) -> None:
440442 else :
441443 code = compile (fd .read (), f"<frozen { modname } >" , "exec" )
442444 printer .generate_file (modname , code )
445+ with printer .block (f"void\n _Py_Deepfreeze_Fini(void)" ):
446+ for p in printer .deallocs :
447+ printer .write (p )
443448 if verbose :
444449 print (f"Cache hits: { printer .hits } , misses: { printer .misses } " )
445450
0 commit comments