bpo-34170: Add _PyCoreConfig.isolated (GH-8417)

* _PyCoreConfig: add isolated and site_import attributes
* Replace Py_IgnoreEnvironment with config->ignore_environment when
  reading the current configuration
* _PyCoreConfig_Read() now sets ignore_environment, utf8_mode,
  isolated and site_import from Py_IgnoreEnvironment, Py_UTF8Mode,
  Py_IsolatedFlag and Py_NoSiteFlag
* _Py_InitializeCore() now sets Py_xxx flags from the configuration
* pymain_read_conf() now uses _PyCoreConfig_Copy() to save/restore
  the configuration.
* Rename _disable_importlib of _PyCoreConfig to _install_importlib
* _PyCoreConfig_SetGlobalConfig() now also set
  Py_HashRandomizationFlag
* Replace !Py_NoSiteFlag with core_config->site_import
diff --git a/Python/pathconfig.c b/Python/pathconfig.c
index 1f6177f..509ea8e 100644
--- a/Python/pathconfig.c
+++ b/Python/pathconfig.c
@@ -283,8 +283,7 @@
 
 
 _PyInitError
-_PyCoreConfig_InitPathConfig(_PyCoreConfig *config,
-                             int *isolated, int *no_site_import)
+_PyCoreConfig_InitPathConfig(_PyCoreConfig *config)
 {
     _PyPathConfig path_config = _PyPathConfig_INIT;
     _PyInitError err;
@@ -345,11 +344,11 @@
         }
     }
 
-    if (path_config.isolated != -1 && isolated != NULL) {
-        *isolated = path_config.isolated;
+    if (path_config.isolated != -1) {
+        config->isolated = path_config.isolated;
     }
-    if (path_config.no_site_import != -1 && no_site_import != NULL) {
-        *no_site_import = path_config.no_site_import;
+    if (path_config.site_import != -1) {
+        config->site_import = path_config.site_import;
     }
 
     _PyPathConfig_Clear(&path_config);
@@ -375,10 +374,7 @@
     _PyInitError err;
     _PyCoreConfig config = _PyCoreConfig_INIT;
 
-    /* Py_IsolatedFlag and Py_NoSiteFlag are left unchanged: pass NULL.
-       _PyCoreConfig_InitPathConfig() will be called later and will set
-       these flags. */
-    err = _PyCoreConfig_Read(&config, NULL, NULL);
+    err = _PyCoreConfig_Read(&config);
     if (_Py_INIT_FAILED(err)) {
         goto error;
     }
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index 584aa55..c88e945 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -599,12 +599,9 @@
 {
     assert(core_config != NULL);
 
-    PyInterpreterState *interp;
-    PyThreadState *tstate;
-    PyObject *bimod, *sysmod, *pstderr;
-    _PyInitError err;
+    _PyCoreConfig_SetGlobalConfig(core_config);
 
-    err = _PyRuntime_Initialize();
+    _PyInitError err = _PyRuntime_Initialize();
     if (_Py_INIT_FAILED(err)) {
         return err;
     }
@@ -646,17 +643,12 @@
         return err;
     }
 
-    if (!core_config->use_hash_seed || core_config->hash_seed) {
-        /* Random or non-zero hash seed */
-        Py_HashRandomizationFlag = 1;
-    }
-
     err = _PyInterpreterState_Enable(&_PyRuntime);
     if (_Py_INIT_FAILED(err)) {
         return err;
     }
 
-    interp = PyInterpreterState_New();
+    PyInterpreterState *interp = PyInterpreterState_New();
     if (interp == NULL) {
         return _Py_INIT_ERR("can't make main interpreter");
     }
@@ -664,8 +656,9 @@
     if (_PyCoreConfig_Copy(&interp->core_config, core_config) < 0) {
         return _Py_INIT_ERR("failed to copy core config");
     }
+    core_config = &interp->core_config;
 
-    tstate = PyThreadState_New(interp);
+    PyThreadState *tstate = PyThreadState_New(interp);
     if (tstate == NULL)
         return _Py_INIT_ERR("can't make first thread");
     (void) PyThreadState_Swap(tstate);
@@ -699,6 +692,7 @@
         return _Py_INIT_ERR("can't make modules dictionary");
     interp->modules = modules;
 
+    PyObject *sysmod;
     err = _PySys_BeginInit(&sysmod);
     if (_Py_INIT_FAILED(err)) {
         return err;
@@ -720,7 +714,7 @@
     if (_PyStructSequence_Init() < 0)
         return _Py_INIT_ERR("can't initialize structseq");
 
-    bimod = _PyBuiltin_Init();
+    PyObject *bimod = _PyBuiltin_Init();
     if (bimod == NULL)
         return _Py_INIT_ERR("can't initialize builtins modules");
     _PyImport_FixupBuiltin(bimod, "builtins", modules);
@@ -734,7 +728,7 @@
 
     /* Set up a preliminary stderr printer until we have enough
        infrastructure for the io module in place. */
-    pstderr = PyFile_NewStdPrinter(fileno(stderr));
+    PyObject *pstderr = PyFile_NewStdPrinter(fileno(stderr));
     if (pstderr == NULL)
         return _Py_INIT_ERR("can't set preliminary stderr");
     _PySys_SetObjectId(&PyId_stderr, pstderr);
@@ -759,7 +753,7 @@
     if (!_PyContext_Init())
         return _Py_INIT_ERR("can't init context");
 
-    if (!core_config->_disable_importlib) {
+    if (core_config->_install_importlib) {
         err = _PyCoreConfig_SetPathConfig(core_config);
         if (_Py_INIT_FAILED(err)) {
             return err;
@@ -767,7 +761,7 @@
     }
 
     /* This call sets up builtin and frozen import support */
-    if (!interp->core_config._disable_importlib) {
+    if (core_config->_install_importlib) {
         err = initimport(interp, sysmod);
         if (_Py_INIT_FAILED(err)) {
             return err;
@@ -809,21 +803,20 @@
 _PyInitError
 _Py_InitializeMainInterpreter(const _PyMainInterpreterConfig *config)
 {
-    PyInterpreterState *interp;
-    PyThreadState *tstate;
-    _PyInitError err;
-
     if (!_PyRuntime.core_initialized) {
         return _Py_INIT_ERR("runtime core not initialized");
     }
 
     /* Get current thread state and interpreter pointer */
-    tstate = PyThreadState_GET();
-    if (!tstate)
+    PyThreadState *tstate = PyThreadState_GET();
+    if (!tstate) {
         return _Py_INIT_ERR("failed to read thread state");
-    interp = tstate->interp;
-    if (!interp)
+    }
+    PyInterpreterState *interp = tstate->interp;
+    if (!interp) {
         return _Py_INIT_ERR("failed to get interpreter");
+    }
+    _PyCoreConfig *core_config = &interp->core_config;
 
     /* Now finish configuring the main interpreter */
     if (_PyMainInterpreterConfig_Copy(&interp->config, config) < 0) {
@@ -834,7 +827,7 @@
         return _Py_ReconfigureMainInterpreter(interp, config);
     }
 
-    if (interp->core_config._disable_importlib) {
+    if (!core_config->_install_importlib) {
         /* Special mode for freeze_importlib: run with no import system
          *
          * This means anything which needs support from extension modules
@@ -852,13 +845,13 @@
         return _Py_INIT_ERR("can't finish initializing sys");
     }
 
-    err = initexternalimport(interp);
+    _PyInitError err = initexternalimport(interp);
     if (_Py_INIT_FAILED(err)) {
         return err;
     }
 
     /* initialize the faulthandler module */
-    err = _PyFaulthandler_Init(interp->core_config.faulthandler);
+    err = _PyFaulthandler_Init(core_config->faulthandler);
     if (_Py_INIT_FAILED(err)) {
         return err;
     }
@@ -875,8 +868,9 @@
         }
     }
 
-    if (_PyTraceMalloc_Init(interp->core_config.tracemalloc) < 0)
+    if (_PyTraceMalloc_Init(core_config->tracemalloc) < 0) {
         return _Py_INIT_ERR("can't initialize tracemalloc");
+    }
 
     err = add_main_module(interp);
     if (_Py_INIT_FAILED(err)) {
@@ -902,7 +896,7 @@
 
     _PyRuntime.initialized = 1;
 
-    if (!Py_NoSiteFlag) {
+    if (core_config->site_import) {
         err = initsite(); /* Module site */
         if (_Py_INIT_FAILED(err)) {
             return err;
@@ -924,11 +918,10 @@
     _PyCoreConfig config = _PyCoreConfig_INIT;
     _PyInitError err;
 
-    config.ignore_environment = Py_IgnoreEnvironmentFlag;
-    config._disable_importlib = !install_importlib;
+    config._install_importlib = install_importlib;
     config.install_signal_handlers = install_sigs;
 
-    err = _PyCoreConfig_Read(&config, &Py_IsolatedFlag, &Py_NoSiteFlag);
+    err = _PyCoreConfig_Read(&config);
     if (_Py_INIT_FAILED(err)) {
         goto done;
     }
@@ -1320,6 +1313,7 @@
     if (_PyCoreConfig_Copy(&interp->core_config, core_config) < 0) {
         return _Py_INIT_ERR("failed to copy core config");
     }
+    core_config = &interp->core_config;
     if (_PyMainInterpreterConfig_Copy(&interp->config, config) < 0) {
         return _Py_INIT_ERR("failed to copy main interpreter config");
     }
@@ -1395,7 +1389,7 @@
             return err;
         }
 
-        if (!Py_NoSiteFlag) {
+        if (core_config->site_import) {
             err = initsite();
             if (_Py_INIT_FAILED(err)) {
                 return err;