summaryrefslogtreecommitdiff
path: root/Python
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@redhat.com>2019-03-05 17:37:44 +0100
committerGitHub <noreply@github.com>2019-03-05 17:37:44 +0100
commitb35be4b3334fbc471a39abbeb68110867b72e3e5 (patch)
tree4c311249db97ae7ebc5d2cb9ed48791549512afe /Python
parent359a2f3daba49fde0d3a07fb3c7a8b051c450d08 (diff)
downloadcpython-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.c20
-rw-r--r--Python/preconfig.c65
-rw-r--r--Python/pylifecycle.c8
-rw-r--r--Python/sysmodule.c2
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