diff options
author | Victor Stinner <vstinner@python.org> | 2024-09-04 11:41:57 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-04 11:41:57 (GMT) |
commit | 0d6b6e34a2980d3d9c342f7ce66e82a39eca295e (patch) | |
tree | c38c5c8a6cc98b0a5ab16ee211a829d2214d9b9f /Python | |
parent | 7d2c2f24daf7a2abd166bb51652ba55c6f55695f (diff) | |
download | cpython-0d6b6e34a2980d3d9c342f7ce66e82a39eca295e.zip cpython-0d6b6e34a2980d3d9c342f7ce66e82a39eca295e.tar.gz cpython-0d6b6e34a2980d3d9c342f7ce66e82a39eca295e.tar.bz2 |
gh-107954, PEP 741: Add PyInitConfig_AddModule() function (#123668)
Diffstat (limited to 'Python')
-rw-r--r-- | Python/initconfig.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/Python/initconfig.c b/Python/initconfig.c index cc4b5b2..2e7623f 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -3423,6 +3423,8 @@ _Py_DumpPathConfig(PyThreadState *tstate) struct PyInitConfig { PyPreConfig preconfig; PyConfig config; + struct _inittab *inittab; + Py_ssize_t inittab_size; PyStatus status; char *err_msg; }; @@ -3874,8 +3876,41 @@ PyInitConfig_SetStrList(PyInitConfig *config, const char *name, int +PyInitConfig_AddModule(PyInitConfig *config, const char *name, + PyObject* (*initfunc)(void)) +{ + size_t size = sizeof(struct _inittab) * (config->inittab_size + 2); + struct _inittab *new_inittab = PyMem_RawRealloc(config->inittab, size); + if (new_inittab == NULL) { + config->status = _PyStatus_NO_MEMORY(); + return -1; + } + config->inittab = new_inittab; + + struct _inittab *entry = &config->inittab[config->inittab_size]; + entry->name = name; + entry->initfunc = initfunc; + + // Terminator entry + entry = &config->inittab[config->inittab_size + 1]; + entry->name = NULL; + entry->initfunc = NULL; + + config->inittab_size++; + return 0; +} + + +int Py_InitializeFromInitConfig(PyInitConfig *config) { + if (config->inittab_size >= 1) { + if (PyImport_ExtendInittab(config->inittab) < 0) { + config->status = _PyStatus_NO_MEMORY(); + return -1; + } + } + _PyPreConfig_GetConfig(&config->preconfig, &config->config); config->status = Py_PreInitializeFromArgs( |