diff options
author | Martin v. Löwis <martin@v.loewis.de> | 2012-06-22 10:20:55 (GMT) |
---|---|---|
committer | Martin v. Löwis <martin@v.loewis.de> | 2012-06-22 10:20:55 (GMT) |
commit | 7800f75827b1be557be16f3b18f5170fbf9fae08 (patch) | |
tree | e4fc657f32119fddf3881ce54bfe89535838c22e /Python/pystate.c | |
parent | 7f59fd7c7c3315c52034b09ffadeb974bc112b5d (diff) | |
download | cpython-7800f75827b1be557be16f3b18f5170fbf9fae08.zip cpython-7800f75827b1be557be16f3b18f5170fbf9fae08.tar.gz cpython-7800f75827b1be557be16f3b18f5170fbf9fae08.tar.bz2 |
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Add version guard for Py_LIMITED_API additions.
Issue #15081: Document PyState_FindModule.
Patch by Robin Schreiber.
Diffstat (limited to 'Python/pystate.c')
-rw-r--r-- | Python/pystate.c | 45 |
1 files changed, 43 insertions, 2 deletions
diff --git a/Python/pystate.c b/Python/pystate.c index a0489ad..cf08a2b 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -239,9 +239,9 @@ _PyThreadState_Init(PyThreadState *tstate) } PyObject* -PyState_FindModule(struct PyModuleDef* m) +PyState_FindModule(struct PyModuleDef* module) { - Py_ssize_t index = m->m_base.m_index; + Py_ssize_t index = module->m_base.m_index; PyInterpreterState *state = PyThreadState_GET()->interp; PyObject *res; if (index == 0) @@ -273,6 +273,47 @@ _PyState_AddModule(PyObject* module, struct PyModuleDef* def) def->m_base.m_index, module); } +int +PyState_AddModule(PyObject* module, struct PyModuleDef* def) +{ + Py_ssize_t index; + PyInterpreterState *state = PyThreadState_GET()->interp; + if (!def) { + Py_FatalError("PyState_AddModule: Module Definition is NULL"); + return -1; + } + index = def->m_base.m_index; + if (state->modules_by_index) { + if(PyList_GET_SIZE(state->modules_by_index) >= index) { + if(module == PyList_GET_ITEM(state->modules_by_index, index)) { + Py_FatalError("PyState_AddModule: Module already added!"); + return -1; + } + } + } + return _PyState_AddModule(module, def); +} + +int +PyState_RemoveModule(struct PyModuleDef* def) +{ + Py_ssize_t index = def->m_base.m_index; + PyInterpreterState *state = PyThreadState_GET()->interp; + if (index == 0) { + Py_FatalError("PyState_RemoveModule: Module index invalid."); + return -1; + } + if (state->modules_by_index == NULL) { + Py_FatalError("PyState_RemoveModule: Interpreters module-list not acessible."); + return -1; + } + if (index > PyList_GET_SIZE(state->modules_by_index)) { + Py_FatalError("PyState_RemoveModule: Module index out of bounds."); + return -1; + } + return PyList_SetItem(state->modules_by_index, index, Py_None); +} + void PyThreadState_Clear(PyThreadState *tstate) { |