diff options
Diffstat (limited to 'Python/pystate.c')
| -rw-r--r-- | Python/pystate.c | 28 | 
1 files changed, 24 insertions, 4 deletions
| diff --git a/Python/pystate.c b/Python/pystate.c index 2ac2fd5..7e0267a 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -212,6 +212,9 @@ new_threadstate(PyInterpreterState *interp, int init)          tstate->on_delete = NULL;          tstate->on_delete_data = NULL; +        tstate->coroutine_wrapper = NULL; +        tstate->in_coroutine_wrapper = 0; +          if (init)              _PyThreadState_Init(tstate); @@ -253,6 +256,9 @@ PyState_FindModule(struct PyModuleDef* module)      Py_ssize_t index = module->m_base.m_index;      PyInterpreterState *state = PyThreadState_GET()->interp;      PyObject *res; +    if (module->m_slots) { +        return NULL; +    }      if (index == 0)          return NULL;      if (state->modules_by_index == NULL) @@ -266,7 +272,13 @@ PyState_FindModule(struct PyModuleDef* module)  int  _PyState_AddModule(PyObject* module, struct PyModuleDef* def)  { -    PyInterpreterState *state = PyThreadState_GET()->interp; +    PyInterpreterState *state; +    if (def->m_slots) { +        PyErr_SetString(PyExc_SystemError, +                        "PyState_AddModule called on module with slots"); +        return -1; +    } +    state = PyThreadState_GET()->interp;      if (!def)          return -1;      if (!state->modules_by_index) { @@ -306,8 +318,14 @@ PyState_AddModule(PyObject* module, struct PyModuleDef* def)  int  PyState_RemoveModule(struct PyModuleDef* def)  { +    PyInterpreterState *state;      Py_ssize_t index = def->m_base.m_index; -    PyInterpreterState *state = PyThreadState_GET()->interp; +    if (def->m_slots) { +        PyErr_SetString(PyExc_SystemError, +                        "PyState_RemoveModule called on module with slots"); +        return -1; +    } +    state = PyThreadState_GET()->interp;      if (index == 0) {          Py_FatalError("PyState_RemoveModule: Module index invalid.");          return -1; @@ -372,6 +390,8 @@ PyThreadState_Clear(PyThreadState *tstate)      tstate->c_tracefunc = NULL;      Py_CLEAR(tstate->c_profileobj);      Py_CLEAR(tstate->c_traceobj); + +    Py_CLEAR(tstate->coroutine_wrapper);  } @@ -403,7 +423,7 @@ tstate_delete_common(PyThreadState *tstate)  void  PyThreadState_Delete(PyThreadState *tstate)  { -    if (tstate == _Py_atomic_load_relaxed(&_PyThreadState_Current)) +    if (tstate == (PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current))          Py_FatalError("PyThreadState_Delete: tstate is still current");  #ifdef WITH_THREAD      if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate) @@ -662,7 +682,7 @@ PyThreadState_IsCurrent(PyThreadState *tstate)  {      /* Must be the tstate for this thread */      assert(PyGILState_GetThisThreadState()==tstate); -    return tstate == _Py_atomic_load_relaxed(&_PyThreadState_Current); +    return tstate == (PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current);  }  /* Internal initialization/finalization functions called by | 
