]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-107954, PEP 741: Adjust Python initialization config (#123663)
authorVictor Stinner <vstinner@python.org>
Wed, 4 Sep 2024 10:58:32 +0000 (12:58 +0200)
committerGitHub <noreply@github.com>
Wed, 4 Sep 2024 10:58:32 +0000 (10:58 +0000)
Setting dev_mode to 1 in an isolated configuration now enables also
faulthandler.

Moreover, setting "module_search_paths" option with
PyInitConfig_SetStrList() now sets "module_search_paths_set" to 1.

Lib/test/test_embed.py
Programs/_testembed.c
Python/initconfig.c

index 17656d7b3d7fb4e8e7ca48ac4a5e3048d2391bb5..aaffd3c13394044f32fc68d5e7421a1d912a9ed9 100644 (file)
@@ -1766,7 +1766,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
             'use_hash_seed': True,
         }
         config_dev_mode(preconfig, config)
-        config['faulthandler'] = 0
         self.check_all_configs("test_initconfig_api", config, preconfig,
                                api=API_ISOLATED)
 
index 13f1db1cc708b53ac54820a77b70fdc3f5badb1b..778da2ff9588ef49d51a339da7193f33a15d7ddd 100644 (file)
@@ -1806,6 +1806,16 @@ static int test_init_set_config(void)
 }
 
 
+static int initconfig_getint(PyInitConfig *config, const char *name)
+{
+    int64_t value;
+    int res = PyInitConfig_GetInt(config, name, &value);
+    assert(res == 0);
+    assert(INT_MIN <= value && value <= INT_MAX);
+    return (int)value;
+}
+
+
 static int test_initconfig_api(void)
 {
     PyInitConfig *config = PyInitConfig_Create();
@@ -1844,7 +1854,6 @@ static int test_initconfig_api(void)
         goto error;
     }
 
-
     if (Py_InitializeFromInitConfig(config) < 0) {
         goto error;
     }
@@ -1876,38 +1885,51 @@ static int test_initconfig_get_api(void)
     assert(PyInitConfig_HasOption(config, "non-existent") == 0);
 
     // test PyInitConfig_GetInt()
-    int64_t value;
-    assert(PyInitConfig_GetInt(config, "dev_mode", &value) == 0);
-    assert(value == 0);
+    assert(initconfig_getint(config, "dev_mode") == 0);
     assert(PyInitConfig_SetInt(config, "dev_mode", 1) == 0);
-    assert(PyInitConfig_GetInt(config, "dev_mode", &value) == 0);
-    assert(value == 1);
+    assert(initconfig_getint(config, "dev_mode") == 1);
 
     // test PyInitConfig_GetInt() on a PyPreConfig option
-    assert(PyInitConfig_GetInt(config, "utf8_mode", &value) == 0);
-    assert(value == 0);
+    assert(initconfig_getint(config, "utf8_mode") == 0);
     assert(PyInitConfig_SetInt(config, "utf8_mode", 1) == 0);
-    assert(PyInitConfig_GetInt(config, "utf8_mode", &value) == 0);
-    assert(value == 1);
+    assert(initconfig_getint(config, "utf8_mode") == 1);
 
     // test PyInitConfig_GetStr()
     char *str;
+    assert(PyInitConfig_GetStr(config, "program_name", &str) == 0);
+    assert(str == NULL);
     assert(PyInitConfig_SetStr(config, "program_name", PROGRAM_NAME_UTF8) == 0);
     assert(PyInitConfig_GetStr(config, "program_name", &str) == 0);
     assert(strcmp(str, PROGRAM_NAME_UTF8) == 0);
     free(str);
 
     // test PyInitConfig_GetStrList() and PyInitConfig_FreeStrList()
+    size_t length;
+    char **items;
+    assert(PyInitConfig_GetStrList(config, "xoptions", &length, &items) == 0);
+    assert(length == 0);
+
     char* xoptions[] = {"faulthandler"};
     assert(PyInitConfig_SetStrList(config, "xoptions",
                                    Py_ARRAY_LENGTH(xoptions), xoptions) == 0);
-    size_t length;
-    char **items;
+
     assert(PyInitConfig_GetStrList(config, "xoptions", &length, &items) == 0);
     assert(length == 1);
     assert(strcmp(items[0], "faulthandler") == 0);
     PyInitConfig_FreeStrList(length, items);
 
+    // Setting hash_seed sets use_hash_seed
+    assert(initconfig_getint(config, "use_hash_seed") == 0);
+    assert(PyInitConfig_SetInt(config, "hash_seed", 123) == 0);
+    assert(initconfig_getint(config, "use_hash_seed") == 1);
+
+    // Setting module_search_paths sets module_search_paths_set
+    assert(initconfig_getint(config, "module_search_paths_set") == 0);
+    char* paths[] = {"search", "path"};
+    assert(PyInitConfig_SetStrList(config, "module_search_paths",
+                                   Py_ARRAY_LENGTH(paths), paths) == 0);
+    assert(initconfig_getint(config, "module_search_paths_set") == 1);
+
     return 0;
 }
 
index d2bb46062209da27fe20357e851a93ea26431413..cc4b5b26eae3110dfea17a4f5d837a6493d395cf 100644 (file)
@@ -1031,7 +1031,6 @@ PyConfig_InitIsolatedConfig(PyConfig *config)
     config->dev_mode = 0;
     config->install_signal_handlers = 0;
     config->use_hash_seed = 0;
-    config->faulthandler = 0;
     config->tracemalloc = 0;
     config->perf_profiling = 0;
     config->int_max_str_digits = _PY_LONG_DEFAULT_MAX_STR_DIGITS;
@@ -3753,7 +3752,7 @@ PyInitConfig_SetInt(PyInitConfig *config, const char *name, int64_t value)
         return -1;
     }
 
-    if (strcmp(name, "hash_seed")) {
+    if (strcmp(name, "hash_seed") == 0) {
         config->config.use_hash_seed = 1;
     }
 
@@ -3863,7 +3862,14 @@ PyInitConfig_SetStrList(PyInitConfig *config, const char *name,
         return -1;
     }
     PyWideStringList *list = raw_member;
-    return _PyWideStringList_FromUTF8(config, list, length, items);
+    if (_PyWideStringList_FromUTF8(config, list, length, items) < 0) {
+        return -1;
+    }
+
+    if (strcmp(name, "module_search_paths") == 0) {
+        config->config.module_search_paths_set = 1;
+    }
+    return 0;
 }