diff options
author | Victor Stinner <vstinner@redhat.com> | 2019-03-05 17:37:44 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-03-05 17:37:44 +0100 |
commit | b35be4b3334fbc471a39abbeb68110867b72e3e5 (patch) | |
tree | 4c311249db97ae7ebc5d2cb9ed48791549512afe /Python | |
parent | 359a2f3daba49fde0d3a07fb3c7a8b051c450d08 (diff) | |
download | cpython-git-b35be4b3334fbc471a39abbeb68110867b72e3e5.tar.gz |
bpo-36142: Add _PyPreConfig.allocator (GH-12181)
* Move 'allocator' and 'dev_mode' fields from _PyCoreConfig
to _PyPreConfig.
* Fix InitConfigTests of test_embed: dev_mode sets allocator to
"debug", add a new tests for env vars with dev mode enabled.
Diffstat (limited to 'Python')
-rw-r--r-- | Python/coreconfig.c | 20 | ||||
-rw-r--r-- | Python/preconfig.c | 65 | ||||
-rw-r--r-- | Python/pylifecycle.c | 8 | ||||
-rw-r--r-- | Python/sysmodule.c | 2 |
4 files changed, 72 insertions, 23 deletions
diff --git a/Python/coreconfig.c b/Python/coreconfig.c index e372de4824..42441e24aa 100644 --- a/Python/coreconfig.c +++ b/Python/coreconfig.c @@ -521,8 +521,6 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) COPY_ATTR(use_hash_seed); COPY_ATTR(hash_seed); COPY_ATTR(_install_importlib); - COPY_ATTR(allocator); - COPY_ATTR(dev_mode); COPY_ATTR(faulthandler); COPY_ATTR(tracemalloc); COPY_ATTR(import_time); @@ -931,10 +929,6 @@ config_read_env_vars(_PyCoreConfig *config) "PYTHONLEGACYWINDOWSSTDIO"); #endif - if (config->allocator == NULL) { - config->allocator = _PyCoreConfig_GetEnv(config, "PYTHONMALLOC"); - } - if (_PyCoreConfig_GetEnv(config, "PYTHONDUMPREFS")) { config->dump_refs = 1; } @@ -1059,11 +1053,6 @@ config_read_complex_options(_PyCoreConfig *config) || config_get_xoption(config, L"importtime")) { config->import_time = 1; } - if (config_get_xoption(config, L"dev" ) || - _PyCoreConfig_GetEnv(config, "PYTHONDEVMODE")) - { - config->dev_mode = 1; - } _PyInitError err; if (config->tracemalloc < 0) { @@ -1427,13 +1416,10 @@ _PyCoreConfig_Read(_PyCoreConfig *config, const _PyPreConfig *preconfig) } /* default values */ - if (config->dev_mode) { + if (config->preconfig.dev_mode) { if (config->faulthandler < 0) { config->faulthandler = 1; } - if (config->allocator == NULL) { - config->allocator = "debug"; - } } if (config->use_hash_seed < 0) { config->use_hash_seed = 0; @@ -1572,8 +1558,6 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) SET_ITEM_INT(install_signal_handlers); SET_ITEM_INT(use_hash_seed); SET_ITEM_UINT(hash_seed); - SET_ITEM_STR(allocator); - SET_ITEM_INT(dev_mode); SET_ITEM_INT(faulthandler); SET_ITEM_INT(tracemalloc); SET_ITEM_INT(import_time); @@ -1950,7 +1934,7 @@ config_init_warnoptions(_PyCoreConfig *config, const _PyCmdline *cmdline) * the lowest precedence entries first so that later entries override them. */ - if (config->dev_mode) { + if (config->preconfig.dev_mode) { err = _Py_wstrlist_append(&config->nwarnoption, &config->warnoptions, L"default"); diff --git a/Python/preconfig.c b/Python/preconfig.c index 3befecfaa0..98e0edead1 100644 --- a/Python/preconfig.c +++ b/Python/preconfig.c @@ -125,6 +125,15 @@ precmdline_clear(_PyPreCmdline *cmdline) void _PyPreConfig_Clear(_PyPreConfig *config) { +#define CLEAR(ATTR) \ + do { \ + PyMem_RawFree(ATTR); \ + ATTR = NULL; \ + } while (0) + + CLEAR(config->allocator); + +#undef CLEAR } @@ -134,6 +143,15 @@ _PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2) _PyPreConfig_Clear(config); #define COPY_ATTR(ATTR) config->ATTR = config2->ATTR +#define COPY_STR_ATTR(ATTR) \ + do { \ + if (config2->ATTR != NULL) { \ + config->ATTR = _PyMem_RawStrdup(config2->ATTR); \ + if (config->ATTR == NULL) { \ + return -1; \ + } \ + } \ + } while (0) COPY_ATTR(isolated); COPY_ATTR(use_environment); @@ -143,8 +161,11 @@ _PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2) COPY_ATTR(legacy_windows_fs_encoding); #endif COPY_ATTR(utf8_mode); + COPY_ATTR(dev_mode); + COPY_STR_ATTR(allocator); #undef COPY_ATTR +#undef COPY_STR_ATTR return 0; } @@ -345,6 +366,7 @@ preconfig_read(_PyPreConfig *config, const _PyPreCmdline *cmdline) { _PyPreConfig_GetGlobalConfig(config); + /* isolated and use_environment */ if (config->isolated > 0) { config->use_environment = 0; } @@ -354,6 +376,7 @@ preconfig_read(_PyPreConfig *config, const _PyPreCmdline *cmdline) config->use_environment = 0; } + /* legacy_windows_fs_encoding, utf8_mode, coerce_c_locale */ if (config->use_environment) { #ifdef MS_WINDOWS _Py_get_env_flag(config, &config->legacy_windows_fs_encoding, @@ -414,11 +437,43 @@ preconfig_read(_PyPreConfig *config, const _PyPreCmdline *cmdline) if (config->utf8_mode < 0) { config->utf8_mode = 0; } + if (config->coerce_c_locale < 0) { + config->coerce_c_locale = 0; + } + + /* dev_mode */ + if ((cmdline && _Py_get_xoption(cmdline->nxoption, cmdline->xoptions, L"dev")) + || _PyPreConfig_GetEnv(config, "PYTHONDEVMODE")) + { + config->dev_mode = 1; + } + if (config->dev_mode < 0) { + config->dev_mode = 0; + } + + /* allocator */ + if (config->dev_mode && config->allocator == NULL) { + config->allocator = _PyMem_RawStrdup("debug"); + if (config->allocator == NULL) { + return _Py_INIT_NO_MEMORY(); + } + } + + if (config->allocator == NULL) { + const char *allocator = _PyPreConfig_GetEnv(config, "PYTHONMALLOC"); + if (allocator) { + config->allocator = _PyMem_RawStrdup(allocator); + if (config->allocator == NULL) { + return _Py_INIT_NO_MEMORY(); + } + } + } assert(config->coerce_c_locale >= 0); assert(config->utf8_mode >= 0); assert(config->isolated >= 0); assert(config->use_environment >= 0); + assert(config->dev_mode >= 0); return _Py_INIT_OK(); } @@ -448,6 +503,12 @@ _PyPreConfig_AsDict(const _PyPreConfig *config, PyObject *dict) } while (0) #define SET_ITEM_INT(ATTR) \ SET_ITEM(#ATTR, PyLong_FromLong(config->ATTR)) +#define FROM_STRING(STR) \ + ((STR != NULL) ? \ + PyUnicode_FromString(STR) \ + : (Py_INCREF(Py_None), Py_None)) +#define SET_ITEM_STR(ATTR) \ + SET_ITEM(#ATTR, FROM_STRING(config->ATTR)) SET_ITEM_INT(isolated); SET_ITEM_INT(use_environment); @@ -457,13 +518,17 @@ _PyPreConfig_AsDict(const _PyPreConfig *config, PyObject *dict) #ifdef MS_WINDOWS SET_ITEM_INT(legacy_windows_fs_encoding); #endif + SET_ITEM_INT(dev_mode); + SET_ITEM_STR(allocator); return 0; fail: return -1; +#undef FROM_STRING #undef SET_ITEM #undef SET_ITEM_INT +#undef SET_ITEM_STR } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index dec890485b..c955a1d94f 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -482,9 +482,9 @@ _Py_Initialize_ReconfigureCore(PyInterpreterState **interp_p, /* bpo-34008: For backward compatibility reasons, calling Py_Main() after Py_Initialize() ignores the new configuration. */ - if (core_config->allocator != NULL) { + if (core_config->preconfig.allocator != NULL) { const char *allocator = _PyMem_GetAllocatorsName(); - if (allocator == NULL || strcmp(core_config->allocator, allocator) != 0) { + if (allocator == NULL || strcmp(core_config->preconfig.allocator, allocator) != 0) { return _Py_INIT_USER_ERR("cannot modify memory allocator " "after first Py_Initialize()"); } @@ -521,8 +521,8 @@ pycore_init_runtime(const _PyCoreConfig *core_config) return err; } - if (core_config->allocator != NULL) { - if (_PyMem_SetupAllocators(core_config->allocator) < 0) { + if (core_config->preconfig.allocator != NULL) { + if (_PyMem_SetupAllocators(core_config->preconfig.allocator) < 0) { return _Py_INIT_USER_ERR("Unknown PYTHONMALLOC allocator"); } } diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 50ba1a71e4..99fd460ff5 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -2180,7 +2180,7 @@ make_flags(void) SetFlag(config->quiet); SetFlag(config->use_hash_seed == 0 || config->hash_seed != 0); SetFlag(config->preconfig.isolated); - PyStructSequence_SET_ITEM(seq, pos++, PyBool_FromLong(config->dev_mode)); + PyStructSequence_SET_ITEM(seq, pos++, PyBool_FromLong(config->preconfig.dev_mode)); SetFlag(config->preconfig.utf8_mode); #undef SetFlag |