summaryrefslogtreecommitdiffstats
path: root/Python/pystate.c
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2012-06-22 10:20:55 (GMT)
committerMartin v. Löwis <martin@v.loewis.de>2012-06-22 10:20:55 (GMT)
commit7800f75827b1be557be16f3b18f5170fbf9fae08 (patch)
treee4fc657f32119fddf3881ce54bfe89535838c22e /Python/pystate.c
parent7f59fd7c7c3315c52034b09ffadeb974bc112b5d (diff)
downloadcpython-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.c45
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)
{