STINNER Victor <vstin...@redhat.com> added the comment:
Description of this long serie of changes. I modified Py_Main() and _Py_InitializeCore() to clearly separate "pre-configuration" from "configuration" steps. The pre-configuration now decodes temporarily the command line arguments and uses its own command line parser to get -E, -I and -X options (-X is needed for -X utf8). The pre-configuration is designed to be as small as possible, it configures: * memory allocators * LC_CTYPE locale and set the UTF-8 mode The _PyPreConfig structure has 8 fields: * allocator * coerce_c_locale * coerce_c_locale_warn * dev_mode * isolated * (Windows only) legacy_windows_fs_encoding * use_environment * utf8_mode I had to include fields which have an impact on other fields. Examples: * dev_mode=1 sets allocator to "default"; * isolated=1 sets use_environment to 0; * legacy_windows_fs_encoding=& sets utf8_mode to 0. _PyCoreConfig_Read() is now only called after the memory allocator and the locale (LC_CTYPE locale and UTF-8 mode) are properly configured. I removed the last side effects of _PyCoreConfig_Read(): it no longer modify the locale. Same for the new _PyPreConfig_Read(): zero size effect. The new _PyPreConfig_Write() and _PyCoreConfig_Write() are now responsible to write the new configurations. There are functions to read the configuration from command line arguments: * _PyPreConfig_ReadFromArgv() * _PyCoreConfig_ReadFromArgv() These functions expect a _PyArgv structure which accepts bytes (wchar*) or Unicode (wchar_t*). I moved coreconfig.h from Include/ to Include/cpython/ to be more explicit that it's excluded from the stable API and that it's CPython specific. I moved all config functions to a new Include/internal/pycore_coreconfig.h. Functions are internal to allow us to modify us anytime until a proper clean public API is designed on top of it. If _PyPreConfig.allocator is set, _PyPreConfig_Write() re-allocate the configuration with the new memory allocator. This tiny thing avoids the new to force a specific memory allocator in many functions. I was able to remove the following code: PyMemAllocatorEx old_alloc; _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); ... PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); Calling Py_Main() after Py_Initialize() is still supported. In this case, it no longer checks the memory allocators name because _PyMem_GetAllocatorsName() returns "pymalloc_debug" (or "malloc_debug" if pymalloc is disabled) after _PyMem_SetupAllocators("debug") is called: names are diffrent. ---------- _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue36142> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com