STINNER Victor <[email protected]> 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 <[email protected]>
<https://bugs.python.org/issue36142>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com