]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-36301: Add _Py_PreInitializeFromConfig() (GH-12536)
authorVictor Stinner <vstinner@redhat.com>
Mon, 25 Mar 2019 17:37:10 +0000 (18:37 +0100)
committerGitHub <noreply@github.com>
Mon, 25 Mar 2019 17:37:10 +0000 (18:37 +0100)
* Initialize _PyPreConfig.dev_mode to -1.
* _PyPreConfig_Read(): coreconfig has the priority over preconfig.
* _PyCoreConfig_Read() now calls _PyPreCmdline_Read() internally.
* config_from_cmdline() now pass _PyPreCmdline to config_read().
* Add _PyPreCmdline_Copy().

Include/cpython/coreconfig.h
Include/cpython/pylifecycle.h
Include/internal/pycore_coreconfig.h
Python/coreconfig.c
Python/preconfig.c
Python/pylifecycle.c

index 83622094f2ab0aeeb113954a04d667c3ed38582b..bb086cbd125aa206ee229fefc75de56668fb51c4 100644 (file)
@@ -115,7 +115,9 @@ typedef struct {
         .isolated = -1, \
         .use_environment = -1, \
         .coerce_c_locale = -1, \
-        .utf8_mode = -1}
+        .utf8_mode = -1, \
+        .dev_mode = -1, \
+        .allocator = NULL}
 
 
 /* --- _PyCoreConfig ---------------------------------------------- */
index 1caeb98e9933c2e2269da895125c2a87b373dbee..a226de8446c6dce75b5ee6e6fb23415a93e76cfa 100644 (file)
@@ -17,6 +17,8 @@ PyAPI_FUNC(int) Py_SetStandardStreamEncoding(const char *encoding,
 PyAPI_FUNC(_PyInitError) _Py_PreInitialize(void);
 PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromPreConfig(
     _PyPreConfig *preconfig);
+PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromConfig(
+    const _PyCoreConfig *coreconfig);
 
 PyAPI_FUNC(_PyInitError) _Py_InitializeCore(
     PyInterpreterState **interp,
index 949bc9b864d6e3b5aa1c2e48f85ede4f11b0d6c4..d44172e0dd8ddb57f643e6e7aa082d5c3115df8a 100644 (file)
@@ -25,11 +25,22 @@ typedef struct {
 /* Note: _PyPreCmdline_INIT sets other fields to 0/NULL */
 
 PyAPI_FUNC(void) _PyPreCmdline_Clear(_PyPreCmdline *cmdline);
+PyAPI_FUNC(int) _PyPreCmdline_Copy(_PyPreCmdline *cmdline,
+    const _PyPreCmdline *cmdline2);
 PyAPI_FUNC(_PyInitError) _PyPreCmdline_SetArgv(_PyPreCmdline *cmdline,
     const _PyArgv *args);
+PyAPI_FUNC(void) _PyPreCmdline_GetPreConfig(
+    _PyPreCmdline *cmdline,
+    const _PyPreConfig *config);
 PyAPI_FUNC(void) _PyPreCmdline_SetPreConfig(
     const _PyPreCmdline *cmdline,
     _PyPreConfig *config);
+PyAPI_FUNC(void) _PyPreCmdline_GetCoreConfig(
+    _PyPreCmdline *cmdline,
+    const _PyCoreConfig *config);
+PyAPI_FUNC(void) _PyPreCmdline_SetCoreConfig(
+    const _PyPreCmdline *cmdline,
+    _PyCoreConfig *config);
 PyAPI_FUNC(_PyInitError) _PyPreCmdline_Read(_PyPreCmdline *cmdline);
 
 
@@ -77,7 +88,8 @@ PyAPI_FUNC(void) _Py_get_env_flag(_PyPreConfig *config,
     int *flag,
     const char *name);
 PyAPI_FUNC(_PyInitError) _PyPreConfig_Read(_PyPreConfig *config,
-    const _PyArgv *args);
+    const _PyArgv *args,
+    const _PyCoreConfig *coreconfig);
 PyAPI_FUNC(int) _PyPreConfig_AsDict(const _PyPreConfig *config,
     PyObject *dict);
 PyAPI_FUNC(_PyInitError) _PyPreConfig_ReadFromArgv(_PyPreConfig *config,
index 130dfccc4dd9f2bfae1ce15f285175dca50fb67f..ba5abb6ca403d2aba7525999b9ffd657109effcf 100644 (file)
@@ -1336,16 +1336,30 @@ config_init_fs_encoding(_PyCoreConfig *config)
    * Py_xxx global configuration variables
 
    See _PyCoreConfig_ReadFromArgv() to parse also command line arguments. */
-_PyInitError
-_PyCoreConfig_Read(_PyCoreConfig *config)
+static _PyInitError
+config_read_impl(_PyCoreConfig *config, _PyPreCmdline *cmdline)
 {
     _PyInitError err;
 
-    err = _Py_PreInitialize();
+    err = _Py_PreInitializeFromConfig(config);
+    if (_Py_INIT_FAILED(err)) {
+        return err;
+    }
+
+    _PyPreCmdline_GetPreConfig(cmdline, &_PyRuntime.preconfig);
+    _PyPreCmdline_GetCoreConfig(cmdline, config);
+
+    err = _PyPreCmdline_Read(cmdline);
     if (_Py_INIT_FAILED(err)) {
         return err;
     }
 
+    _PyPreCmdline_SetCoreConfig(cmdline, config);
+
+    if (_PyWstrList_Extend(&config->xoptions, &cmdline->xoptions) < 0) {
+        return _Py_INIT_NO_MEMORY();
+    }
+
     if (_PyPreConfig_Copy(&config->preconfig, &_PyRuntime.preconfig) < 0) {
         return _Py_INIT_NO_MEMORY();
     }
@@ -1454,6 +1468,41 @@ _PyCoreConfig_Read(_PyCoreConfig *config)
 }
 
 
+static _PyInitError
+config_read(_PyCoreConfig *config, const _PyPreCmdline *src_cmdline)
+{
+    _PyInitError err;
+
+    err = _Py_PreInitializeFromConfig(config);
+    if (_Py_INIT_FAILED(err)) {
+        return err;
+    }
+
+    _PyPreCmdline cmdline = _PyPreCmdline_INIT;
+
+    if (src_cmdline) {
+        if (_PyPreCmdline_Copy(&cmdline, src_cmdline) < 0) {
+            err = _Py_INIT_NO_MEMORY();
+            goto done;
+        }
+    }
+
+    err = config_read_impl(config, &cmdline);
+
+done:
+    _PyPreCmdline_Clear(&cmdline);
+    return err;
+
+}
+
+
+_PyInitError
+_PyCoreConfig_Read(_PyCoreConfig *config)
+{
+    return config_read(config, NULL);
+}
+
+
 static void
 config_init_stdio(const _PyCoreConfig *config)
 {
@@ -2025,9 +2074,6 @@ config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline)
     }
 
     _PyPreCmdline_SetPreConfig(&cmdline->precmdline, &_PyRuntime.preconfig);
-    if (_PyWstrList_Extend(&config->xoptions, &cmdline->precmdline.xoptions) < 0) {
-        return _Py_INIT_NO_MEMORY();
-    }
 
     err = config_parse_cmdline(config, cmdline, &need_usage);
     if (_Py_INIT_FAILED(err)) {
@@ -2055,7 +2101,7 @@ config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline)
         return err;
     }
 
-    err = _PyCoreConfig_Read(config);
+    err = config_read(config, &cmdline->precmdline);
     if (_Py_INIT_FAILED(err)) {
         return err;
     }
@@ -2090,7 +2136,7 @@ _PyCoreConfig_ReadFromArgv(_PyCoreConfig *config, const _PyArgv *args)
 {
     _PyInitError err;
 
-    err = _Py_PreInitialize();
+    err = _Py_PreInitializeFromConfig(config);
     if (_Py_INIT_FAILED(err)) {
         return err;
     }
index c16f34083ed67d69947252397865c17fc4268745..ac87a7a3c7e97a0ed15404748b533dbd97f7b7d7 100644 (file)
@@ -110,6 +110,22 @@ _PyPreCmdline_Clear(_PyPreCmdline *cmdline)
 }
 
 
+int
+_PyPreCmdline_Copy(_PyPreCmdline *cmdline, const _PyPreCmdline *cmdline2)
+{
+    _PyPreCmdline_Clear(cmdline);
+    if (_PyWstrList_Copy(&cmdline->argv, &cmdline2->argv) < 0) {
+        return -1;
+    }
+    if (_PyWstrList_Copy(&cmdline->xoptions, &cmdline2->xoptions) < 0) {
+        return -1;
+    }
+    cmdline->use_environment = cmdline2->use_environment;
+    cmdline->isolated = cmdline2->isolated;
+    return 0;
+}
+
+
 _PyInitError
 _PyPreCmdline_SetArgv(_PyPreCmdline *cmdline, const _PyArgv *args)
 {
@@ -117,7 +133,7 @@ _PyPreCmdline_SetArgv(_PyPreCmdline *cmdline, const _PyArgv *args)
 }
 
 
-static void
+void
 _PyPreCmdline_GetPreConfig(_PyPreCmdline *cmdline, const _PyPreConfig *config)
 {
 #define COPY_ATTR(ATTR) \
@@ -132,6 +148,36 @@ _PyPreCmdline_GetPreConfig(_PyPreCmdline *cmdline, const _PyPreConfig *config)
 }
 
 
+void
+_PyPreCmdline_GetCoreConfig(_PyPreCmdline *cmdline, const _PyCoreConfig *config)
+{
+#define COPY_ATTR(ATTR) \
+    if (config->preconfig.ATTR != -1) { \
+        cmdline->ATTR = config->preconfig.ATTR; \
+    }
+
+    COPY_ATTR(use_environment);
+    COPY_ATTR(isolated);
+
+#undef COPY_ATTR
+}
+
+
+void
+_PyPreCmdline_SetCoreConfig(const _PyPreCmdline *cmdline, _PyCoreConfig *config)
+{
+#define COPY_ATTR(ATTR) \
+    if (config->preconfig.ATTR == -1 && cmdline->ATTR != -1) { \
+        config->preconfig.ATTR = cmdline->ATTR; \
+    }
+
+    COPY_ATTR(use_environment);
+    COPY_ATTR(isolated);
+
+#undef COPY_ATTR
+}
+
+
 /* --- _PyPreConfig ----------------------------------------------- */
 
 void
@@ -628,7 +674,8 @@ _PyPreCmdline_Read(_PyPreCmdline *cmdline)
 
    See _PyPreConfig_ReadFromArgv() to parse also command line arguments. */
 _PyInitError
-_PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args)
+_PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args,
+                  const _PyCoreConfig *coreconfig)
 {
     _PyInitError err;
     _PyPreCmdline cmdline = _PyPreCmdline_INIT;
@@ -642,8 +689,17 @@ _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args)
     /* Set LC_CTYPE to the user preferred locale */
     _Py_SetLocaleFromEnv(LC_CTYPE);
 
+    _PyPreConfig_GetGlobalConfig(config);
+
     _PyPreCmdline_GetPreConfig(&cmdline, config);
 
+    if (coreconfig) {
+        _PyPreCmdline_GetCoreConfig(&cmdline, coreconfig);
+        if (config->dev_mode == -1) {
+            config->dev_mode = coreconfig->preconfig.dev_mode;
+        }
+    }
+
     if (args) {
         err = _PyPreCmdline_SetArgv(&cmdline, args);
         if (_Py_INIT_FAILED(err)) {
@@ -724,7 +780,7 @@ _PyPreConfig_ReadFromArgv(_PyPreConfig *config, const _PyArgv *args)
         Py_LegacyWindowsFSEncodingFlag = config->legacy_windows_fs_encoding;
 #endif
 
-        err = _PyPreConfig_Read(config, args);
+        err = _PyPreConfig_Read(config, args, NULL);
         if (_Py_INIT_FAILED(err)) {
             goto done;
         }
index ea1b731a56b266b79c7464b0c945e496acb9e758..66cadc99c7bad66f4272d23ac03878d9ba699d9d 100644 (file)
@@ -715,7 +715,9 @@ _Py_InitializeCore_impl(PyInterpreterState **interp_p,
 
 
 static _PyInitError
-pyinit_preinit(_PyPreConfig *config, const _PyPreConfig *src_config)
+pyinit_preinit(_PyPreConfig *config,
+               const _PyPreConfig *src_config,
+               const _PyCoreConfig *coreconfig)
 {
     _PyInitError err;
 
@@ -729,13 +731,17 @@ pyinit_preinit(_PyPreConfig *config, const _PyPreConfig *src_config)
         return _Py_INIT_OK();
     }
 
+    if (!src_config && coreconfig) {
+        src_config = &coreconfig->preconfig;
+    }
+
     if (src_config) {
         if (_PyPreConfig_Copy(config, src_config) < 0) {
             return _Py_INIT_ERR("failed to copy pre config");
         }
     }
 
-    err = _PyPreConfig_Read(config, NULL);
+    err = _PyPreConfig_Read(config, NULL, coreconfig);
     if (_Py_INIT_FAILED(err)) {
         return err;
     }
@@ -750,18 +756,28 @@ pyinit_preinit(_PyPreConfig *config, const _PyPreConfig *src_config)
 }
 
 
+_PyInitError
+_Py_PreInitialize(void)
+{
+    _PyPreConfig config = _PyPreConfig_INIT;
+    _PyInitError err = pyinit_preinit(&config, NULL, NULL);
+    _PyPreConfig_Clear(&config);
+    return err;
+}
+
+
 _PyInitError
 _Py_PreInitializeFromPreConfig(_PyPreConfig *config)
 {
-    return pyinit_preinit(config, NULL);
+    return pyinit_preinit(config, NULL, NULL);
 }
 
 
 _PyInitError
-_Py_PreInitialize(void)
+_Py_PreInitializeFromConfig(const _PyCoreConfig *coreconfig)
 {
     _PyPreConfig config = _PyPreConfig_INIT;
-    _PyInitError err = pyinit_preinit(&config, NULL);
+    _PyInitError err = pyinit_preinit(&config, NULL, coreconfig);
     _PyPreConfig_Clear(&config);
     return err;
 }
@@ -814,16 +830,13 @@ _Py_InitializeCore(PyInterpreterState **interp_p,
 
     assert(src_config != NULL);
 
-    _PyCoreConfig local_config = _PyCoreConfig_INIT;
-
-    err = pyinit_preinit(&local_config.preconfig, &src_config->preconfig);
+    err = _Py_PreInitializeFromConfig(src_config);
     if (_Py_INIT_FAILED(err)) {
-        goto done;
+        return err;
     }
 
+    _PyCoreConfig local_config = _PyCoreConfig_INIT;
     err = pyinit_coreconfig(&local_config, src_config, interp_p);
-
-done:
     _PyCoreConfig_Clear(&local_config);
     return err;
 }