From b75d7e243512afcfb2285e6471262478383e09db Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 1 Aug 2018 02:13:04 +0200 Subject: bpo-34170: Add _PyCoreConfig._frozen parameter (GH-8591) Modify frozenmain.c to use _Py_InitializeFromConfig(). --- Include/pystate.h | 9 ++++++++- Lib/test/test_embed.py | 4 ++++ Modules/getpath.c | 6 +++--- Modules/main.c | 5 +++++ Programs/_freeze_importlib.c | 3 +-- Programs/_testembed.c | 6 ++++++ Python/frozenmain.c | 12 ++++++++++-- 7 files changed, 37 insertions(+), 8 deletions(-) diff --git a/Include/pystate.h b/Include/pystate.h index 612e7de..bc1e23e 100644 --- a/Include/pystate.h +++ b/Include/pystate.h @@ -235,6 +235,12 @@ typedef struct { See PEP 552 "Deterministic pycs" for more details. */ const char *_check_hash_pycs_mode; + + /* If greater than 0, suppress _PyPathConfig_Calculate() warnings. + + If set to -1 (default), inherit Py_FrozenFlag value. */ + int _frozen; + } _PyCoreConfig; #ifdef MS_WINDOWS @@ -269,7 +275,8 @@ typedef struct { .user_site_directory = -1, \ .unbuffered_stdio = -1, \ _PyCoreConfig_WINDOWS_INIT \ - ._install_importlib = 1} + ._install_importlib = 1, \ + ._frozen = -1} /* Note: _PyCoreConfig_INIT sets other fields to 0/NULL */ /* Placeholders while working on the new configuration API diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index e00b1d8..dd7d273 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -289,6 +289,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): '_install_importlib': 1, '_check_hash_pycs_mode': 'default', + '_frozen': 0, } def check_config(self, testname, expected): @@ -330,6 +331,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'unbuffered_stdio': 1, 'utf8_mode': 1, 'user_site_directory': 0, + '_frozen': 1, } self.check_config("init_global_config", config) @@ -362,7 +364,9 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): 'unbuffered_stdio': 1, 'user_site_directory': 0, 'faulthandler': 1, + '_check_hash_pycs_mode': 'always', + '_frozen': 1, } self.check_config("init_from_config", config) diff --git a/Modules/getpath.c b/Modules/getpath.c index 6d966e1..041cb14 100644 --- a/Modules/getpath.c +++ b/Modules/getpath.c @@ -372,7 +372,7 @@ calculate_prefix(const _PyCoreConfig *core_config, { calculate->prefix_found = search_for_prefix(core_config, calculate, prefix); if (!calculate->prefix_found) { - if (!Py_FrozenFlag) { + if (!core_config->_frozen) { fprintf(stderr, "Could not find platform independent libraries \n"); } @@ -495,7 +495,7 @@ calculate_exec_prefix(const _PyCoreConfig *core_config, calculate, exec_prefix); if (!calculate->exec_prefix_found) { - if (!Py_FrozenFlag) { + if (!core_config->_frozen) { fprintf(stderr, "Could not find platform dependent libraries \n"); } @@ -915,7 +915,7 @@ calculate_path_impl(const _PyCoreConfig *core_config, calculate_exec_prefix(core_config, calculate, exec_prefix); if ((!calculate->prefix_found || !calculate->exec_prefix_found) && - !Py_FrozenFlag) + !core_config->_frozen) { fprintf(stderr, "Consider setting $PYTHONHOME to [:]\n"); diff --git a/Modules/main.c b/Modules/main.c index 8000a1a..88e8262 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -573,6 +573,7 @@ _PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config) COPY_FLAG(legacy_windows_fs_encoding, Py_LegacyWindowsFSEncodingFlag); COPY_FLAG(legacy_windows_stdio, Py_LegacyWindowsStdioFlag); #endif + COPY_FLAG(_frozen, Py_FrozenFlag); COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag); COPY_NOT_FLAG(site_import, Py_NoSiteFlag); @@ -759,6 +760,7 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) COPY_ATTR(legacy_windows_stdio); #endif COPY_ATTR(_check_hash_pycs_mode); + COPY_ATTR(_frozen); #undef COPY_ATTR #undef COPY_STR_ATTR @@ -2281,6 +2283,9 @@ _PyCoreConfig_Read(_PyCoreConfig *config) if (config->utf8_mode < 0) { config->utf8_mode = 0; } + if (config->_frozen < 0) { + config->_frozen = 0; + } return _Py_INIT_OK(); } diff --git a/Programs/_freeze_importlib.c b/Programs/_freeze_importlib.c index 05ae59c..fdf5013 100644 --- a/Programs/_freeze_importlib.c +++ b/Programs/_freeze_importlib.c @@ -82,8 +82,7 @@ main(int argc, char *argv[]) /* Don't install importlib, since it could execute outdated bytecode. */ config._install_importlib = 0; config.install_signal_handlers = 1; - - Py_FrozenFlag++; + config._frozen = 1; _PyInitError err = _Py_InitializeFromConfig(&config); /* No need to call _PyCoreConfig_Clear() since we didn't allocate any diff --git a/Programs/_testembed.c b/Programs/_testembed.c index f7e7749..94db29b 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -368,6 +368,7 @@ dump_config(void) printf("_install_importlib = %i\n", config->_install_importlib); printf("_check_hash_pycs_mode = %s\n", config->_check_hash_pycs_mode); + printf("_frozen = %i\n", config->_frozen); #undef ASSERT_EQUAL #undef ASSERT_STR_EQUAL @@ -420,6 +421,8 @@ static int test_init_global_config(void) putenv("PYTHONUNBUFFERED="); Py_UnbufferedStdioFlag = 1; + Py_FrozenFlag = 1; + /* FIXME: test Py_LegacyWindowsFSEncodingFlag */ /* FIXME: test Py_LegacyWindowsStdioFlag */ @@ -525,6 +528,9 @@ static int test_init_from_config(void) config._check_hash_pycs_mode = "always"; + Py_FrozenFlag = 0; + config._frozen = 1; + _PyInitError err = _Py_InitializeFromConfig(&config); /* Don't call _PyCoreConfig_Clear() since all strings are static */ if (_Py_INIT_FAILED(err)) { diff --git a/Python/frozenmain.c b/Python/frozenmain.c index a3b6196..86af2b6 100644 --- a/Python/frozenmain.c +++ b/Python/frozenmain.c @@ -41,7 +41,8 @@ Py_FrozenMain(int argc, char **argv) } } - Py_FrozenFlag = 1; /* Suppress errors from getpath.c */ + _PyCoreConfig config = _PyCoreConfig_INIT; + config._frozen = 1; /* Suppress errors from getpath.c */ if ((p = Py_GETENV("PYTHONINSPECT")) && *p != '\0') inspect = 1; @@ -80,7 +81,14 @@ Py_FrozenMain(int argc, char **argv) #endif /* MS_WINDOWS */ if (argc >= 1) Py_SetProgramName(argv_copy[0]); - Py_Initialize(); + + err = _Py_InitializeFromConfig(&config); + /* No need to call _PyCoreConfig_Clear() since we didn't allocate any + memory: program_name is a constant string. */ + if (_Py_INIT_FAILED(err)) { + _Py_FatalInitError(err); + } + #ifdef MS_WINDOWS PyWinFreeze_ExeInit(); #endif -- cgit v0.12