]> granicus.if.org Git - python/commitdiff
bpo-36444: Add _PyCoreConfig._init_main (GH-12572)
authorVictor Stinner <vstinner@redhat.com>
Wed, 27 Mar 2019 01:04:16 +0000 (02:04 +0100)
committerGitHub <noreply@github.com>
Wed, 27 Mar 2019 01:04:16 +0000 (02:04 +0100)
* Add _PyCoreConfig._init_main: if equals to zero,
  _Py_InitializeFromConfig() doesn't call
  _Py_InitializeMainInterpreter().
* Add interp_p parameter to _Py_InitializeFromConfig().
* pymain_init() now calls _Py_InitializeFromConfig().
* Make _Py_InitializeCore() private.

Include/cpython/coreconfig.h
Include/cpython/pylifecycle.h
Lib/test/test_embed.py
Modules/main.c
Programs/_freeze_importlib.c
Programs/_testembed.c
Python/coreconfig.c
Python/frozenmain.c
Python/pylifecycle.c

index 827a19a145d0be877808c3d740b11284662f5823..53493ff85a37c443c1badc6c4b3ab5f574cc9021 100644 (file)
@@ -365,6 +365,9 @@ typedef struct {
        If set to -1 (default), inherit Py_FrozenFlag value. */
     int _frozen;
 
+    /* If non-zero, use "main" Python initialization */
+    int _init_main;
+
 } _PyCoreConfig;
 
 #ifdef MS_WINDOWS
@@ -398,7 +401,8 @@ typedef struct {
         .buffered_stdio = -1, \
         ._install_importlib = 1, \
         ._check_hash_pycs_mode = "default", \
-        ._frozen = -1}
+        ._frozen = -1, \
+        ._init_main = 1}
 /* Note: _PyCoreConfig_INIT sets other fields to 0/NULL */
 
 
index 1db1d2167cb131ca1c2ef35f375322dec616f1ab..496dcb2c604376191b6cb375851c969575bc7210 100644 (file)
@@ -20,9 +20,6 @@ PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromPreConfig(
 PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromConfig(
     const _PyCoreConfig *coreconfig);
 
-PyAPI_FUNC(_PyInitError) _Py_InitializeCore(
-    const _PyCoreConfig *config,
-    PyInterpreterState **interp);
 PyAPI_FUNC(int) _Py_IsCoreInitialized(void);
 
 
@@ -32,7 +29,8 @@ PyAPI_FUNC(_PyInitError) _Py_InitializeMainInterpreter(
 /* Initialization and finalization */
 
 PyAPI_FUNC(_PyInitError) _Py_InitializeFromConfig(
-    const _PyCoreConfig *config);
+    const _PyCoreConfig *config,
+    PyInterpreterState **interp_p);
 PyAPI_FUNC(void) _Py_NO_RETURN _Py_ExitInitError(_PyInitError err);
 
 /* Py_PyAtExit is for the atexit module, Py_AtExit is for low-level
index f5e3cef68a5413efbeb7322a4f8e36ef67088ecb..c63ea5a45e4bb7f488c1b1e986df1c335bcd32d6 100644 (file)
@@ -338,6 +338,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
         '_install_importlib': 1,
         '_check_hash_pycs_mode': 'default',
         '_frozen': 0,
+        '_init_main': 1,
     }
     if MS_WINDOWS:
         DEFAULT_PRE_CONFIG.update({
index 05b42cbc6c838e2226a6778d32c77a73194f0cc1..57d16093dcaac9c91584830eea6df0aa5e8645e8 100644 (file)
@@ -53,19 +53,6 @@ done:
 }
 
 
-static _PyInitError
-pymain_init_coreconfig(_PyCoreConfig *config, const _PyArgv *args,
-                       PyInterpreterState **interp_p)
-{
-    _PyInitError err = _PyCoreConfig_Read(config, args);
-    if (_Py_INIT_FAILED(err)) {
-        return err;
-    }
-
-    return _Py_InitializeCore(config, interp_p);
-}
-
-
 static _PyInitError
 pymain_init(const _PyArgv *args, PyInterpreterState **interp_p)
 {
@@ -91,18 +78,22 @@ pymain_init(const _PyArgv *args, PyInterpreterState **interp_p)
     }
 
     _PyCoreConfig config = _PyCoreConfig_INIT;
-    err = pymain_init_coreconfig(&config, args, interp_p);
-    _PyCoreConfig_Clear(&config);
+
+    err = _PyCoreConfig_Read(&config, args);
     if (_Py_INIT_FAILED(err)) {
-        return err;
+        goto done;
     }
 
-    err = _Py_InitializeMainInterpreter(*interp_p);
+    err = _Py_InitializeFromConfig(&config, interp_p);
     if (_Py_INIT_FAILED(err)) {
-        return err;
+        goto done;
     }
 
-    return _Py_INIT_OK();
+    err = _Py_INIT_OK();
+
+done:
+    _PyCoreConfig_Clear(&config);
+    return err;
 }
 
 
index 0818012d8c5abd4dbc7f379046e375ddfe4fc024..774748dc0915b4e489bbc7d644343ed5ad63d91b 100644 (file)
@@ -84,8 +84,9 @@ main(int argc, char *argv[])
     /* Don't install importlib, since it could execute outdated bytecode. */
     config._install_importlib = 0;
     config._frozen = 1;
+    config._init_main = 0;
 
-    _PyInitError err = _Py_InitializeFromConfig(&config);
+    _PyInitError err = _Py_InitializeFromConfig(&config, NULL);
     /* No need to call _PyCoreConfig_Clear() since we didn't allocate any
        memory: program_name is a constant string. */
     if (_Py_INIT_FAILED(err)) {
index 76de8aab5ba6cbde1aadee19594bb9a9d3605cc2..70587990f8de2e1b655b56f1fccbb1338d64e62e 100644 (file)
@@ -529,7 +529,7 @@ static int test_init_from_config(void)
     Py_FrozenFlag = 0;
     config._frozen = 1;
 
-    err = _Py_InitializeFromConfig(&config);
+    err = _Py_InitializeFromConfig(&config, NULL);
     /* Don't call _PyCoreConfig_Clear() since all strings are static */
     if (_Py_INIT_FAILED(err)) {
         _Py_ExitInitError(err);
@@ -638,7 +638,7 @@ static int test_init_isolated(void)
     config.program_name = L"./_testembed";
 
     test_init_env_dev_mode_putenvs();
-    err = _Py_InitializeFromConfig(&config);
+    err = _Py_InitializeFromConfig(&config, NULL);
     if (_Py_INIT_FAILED(err)) {
         _Py_ExitInitError(err);
     }
@@ -669,7 +669,7 @@ static int test_preinit_isolated1(void)
     config.program_name = L"./_testembed";
 
     test_init_env_dev_mode_putenvs();
-    err = _Py_InitializeFromConfig(&config);
+    err = _Py_InitializeFromConfig(&config, NULL);
     if (_Py_INIT_FAILED(err)) {
         _Py_ExitInitError(err);
     }
@@ -706,7 +706,7 @@ static int test_preinit_isolated2(void)
     config.program_name = L"./_testembed";
 
     test_init_env_dev_mode_putenvs();
-    err = _Py_InitializeFromConfig(&config);
+    err = _Py_InitializeFromConfig(&config, NULL);
     if (_Py_INIT_FAILED(err)) {
         _Py_ExitInitError(err);
     }
@@ -723,7 +723,7 @@ static int test_init_dev_mode(void)
     putenv("PYTHONMALLOC=");
     config.dev_mode = 1;
     config.program_name = L"./_testembed";
-    _PyInitError err = _Py_InitializeFromConfig(&config);
+    _PyInitError err = _Py_InitializeFromConfig(&config, NULL);
     if (_Py_INIT_FAILED(err)) {
         _Py_ExitInitError(err);
     }
index 944a9e22ca1201f6ba73d585a141a1c524ecc79b..ecb22e5667d7b32d193c0e0e77ff7117d1051bec 100644 (file)
@@ -610,6 +610,7 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2)
     COPY_WSTR_ATTR(run_filename);
     COPY_ATTR(_check_hash_pycs_mode);
     COPY_ATTR(_frozen);
+    COPY_ATTR(_init_main);
 
 #undef COPY_ATTR
 #undef COPY_STR_ATTR
@@ -715,6 +716,7 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config)
     SET_ITEM_INT(_install_importlib);
     SET_ITEM_STR(_check_hash_pycs_mode);
     SET_ITEM_INT(_frozen);
+    SET_ITEM_INT(_init_main);
 
     return dict;
 
index 6554aa75b038f8a063d70ec8994a4a8cbd3f55aa..041b4670ca38e86240a057325e25a5edb9711ccf 100644 (file)
@@ -82,7 +82,7 @@ Py_FrozenMain(int argc, char **argv)
     if (argc >= 1)
         Py_SetProgramName(argv_copy[0]);
 
-    err = _Py_InitializeFromConfig(&config);
+    err = _Py_InitializeFromConfig(&config, NULL);
     /* No need to call _PyCoreConfig_Clear() since we didn't allocate any
        memory: program_name is a constant string. */
     if (_Py_INIT_FAILED(err)) {
index ca90e7238b66ad07252d23e8f859e49fd8c53276..f255fd9e132e3c42a3cb33da9eb268900fb40f57 100644 (file)
@@ -458,7 +458,7 @@ _Py_SetLocaleFromEnv(int category)
 /* Global initializations.  Can be undone by Py_Finalize().  Don't
    call this twice without an intervening Py_Finalize() call.
 
-   Every call to _Py_InitializeCore, Py_Initialize or Py_InitializeEx
+   Every call to _Py_InitializeFromConfig, Py_Initialize or Py_InitializeEx
    must have a corresponding call to Py_Finalize.
 
    Locking: you must hold the interpreter lock while calling these APIs.
@@ -832,7 +832,7 @@ pyinit_coreconfig(_PyCoreConfig *config, const _PyCoreConfig *src_config,
  * to the Python C API (unless the API is explicitly listed as being
  * safe to call without calling Py_Initialize first)
  */
-_PyInitError
+static _PyInitError
 _Py_InitializeCore(const _PyCoreConfig *src_config,
                    PyInterpreterState **interp_p)
 {
@@ -981,7 +981,8 @@ _Py_InitializeMainInterpreter(PyInterpreterState *interp)
 #undef _INIT_DEBUG_PRINT
 
 _PyInitError
-_Py_InitializeFromConfig(const _PyCoreConfig *config)
+_Py_InitializeFromConfig(const _PyCoreConfig *config,
+                         PyInterpreterState **interp_p)
 {
     PyInterpreterState *interp = NULL;
     _PyInitError err;
@@ -989,12 +990,18 @@ _Py_InitializeFromConfig(const _PyCoreConfig *config)
     if (_Py_INIT_FAILED(err)) {
         return err;
     }
+    if (interp_p) {
+        *interp_p = interp;
+    }
     config = &interp->core_config;
 
-    err = _Py_InitializeMainInterpreter(interp);
-    if (_Py_INIT_FAILED(err)) {
-        return err;
+    if (config->_init_main) {
+        err = _Py_InitializeMainInterpreter(interp);
+        if (_Py_INIT_FAILED(err)) {
+            return err;
+        }
     }
+
     return _Py_INIT_OK();
 }
 
@@ -1007,13 +1014,10 @@ Py_InitializeEx(int install_sigs)
         return;
     }
 
-    _PyInitError err;
     _PyCoreConfig config = _PyCoreConfig_INIT;
     config.install_signal_handlers = install_sigs;
 
-    err = _Py_InitializeFromConfig(&config);
-    _PyCoreConfig_Clear(&config);
-
+    _PyInitError err = _Py_InitializeFromConfig(&config, NULL);
     if (_Py_INIT_FAILED(err)) {
         _Py_ExitInitError(err);
     }