From f7e9253e85923cb7a032a6e939ff179c45c48384 Mon Sep 17 00:00:00 2001 From: ahgamut <41098605+ahgamut@users.noreply.github.com> Date: Sat, 18 Jun 2022 03:23:11 +0530 Subject: [PATCH] make test_atexit pass in MODE= _testcapi.run_in_subinterp makes a questionable PyImport_Cleanup(), which we work around by having a separate cleanup function for the lookup tables. also added a separate initialization function for the lookup tables for symmetry. some commented out code in the previous commit messed with GC, it was made visible again. --- third_party/python/Include/import.h | 2 + third_party/python/Python/finalize.c | 1 + third_party/python/Python/import.c | 67 +++++++++++++------------ third_party/python/Python/pylifecycle.c | 1 + 4 files changed, 39 insertions(+), 32 deletions(-) diff --git a/third_party/python/Include/import.h b/third_party/python/Include/import.h index 5e844880a..a2509e1a5 100644 --- a/third_party/python/Include/import.h +++ b/third_party/python/Include/import.h @@ -73,6 +73,8 @@ PyObject * PyImport_GetImporter(PyObject *path); PyObject * PyImport_Import(PyObject *name); PyObject * PyImport_ReloadModule(PyObject *m); void PyImport_Cleanup(void); +void _PyImportLookupTables_Init(void); +void _PyImportLookupTables_Cleanup(void); #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 int PyImport_ImportFrozenModuleObject( PyObject *name diff --git a/third_party/python/Python/finalize.c b/third_party/python/Python/finalize.c index b68b910c0..81d45ad99 100644 --- a/third_party/python/Python/finalize.c +++ b/third_party/python/Python/finalize.c @@ -96,6 +96,7 @@ Py_FinalizeEx(void) #endif /* Destroy all modules */ PyImport_Cleanup(); + _PyImportLookupTables_Cleanup(); /* Flush sys.stdout and sys.stderr (again, in case more was printed) */ if (_Py_FlushStdFiles() < 0) { diff --git a/third_party/python/Python/import.c b/third_party/python/Python/import.c index 2a02c68d2..edddd51f0 100644 --- a/third_party/python/Python/import.c +++ b/third_party/python/Python/import.c @@ -154,8 +154,6 @@ static int cmp_initentry(const void *_x, const void *_y) { void _PyImport_Init(void) { - size_t i, n; - PyInterpreterState *interp = PyThreadState_Get()->interp; initstr = PyUnicode_InternFromString("__init__"); if (initstr == NULL) @@ -163,27 +161,44 @@ _PyImport_Init(void) interp->builtins_copy = PyDict_Copy(interp->builtins); if (interp->builtins_copy == NULL) Py_FatalError("Can't backup builtins dict"); +} - for(n=0; PyImport_Inittab[n].name; n++); - Builtins_Lookup.n = n; - Builtins_Lookup.entries = malloc(sizeof(initentry) * n); - for(i=0; i < n; i++) { - Builtins_Lookup.entries[i].name = PyImport_Inittab[i].name; - Builtins_Lookup.entries[i].tab = &(PyImport_Inittab[i]); +void _PyImportLookupTables_Init(void) { + size_t i, n; + if (Builtins_Lookup.entries == NULL) { + for(n=0; PyImport_Inittab[n].name; n++); + Builtins_Lookup.n = n; + Builtins_Lookup.entries = malloc(sizeof(initentry) * n); + for(i=0; i < n; i++) { + Builtins_Lookup.entries[i].name = PyImport_Inittab[i].name; + Builtins_Lookup.entries[i].tab = &(PyImport_Inittab[i]); + } + qsort(Builtins_Lookup.entries, Builtins_Lookup.n, sizeof(initentry), cmp_initentry); } - qsort(Builtins_Lookup.entries, Builtins_Lookup.n, sizeof(initentry), cmp_initentry); - - for(n=0; PyImport_FrozenModules[n].name; n++); - Frozens_Lookup.n = n; - Frozens_Lookup.entries = malloc(sizeof(initentry) * n); - for(i=0; i