diff -r b19e6456f2ce Modules/_localemodule.c --- a/Modules/_localemodule.c Wed Aug 15 10:56:36 2012 +0200 +++ b/Modules/_localemodule.c Wed Aug 15 11:04:10 2012 +0200 @@ -40,7 +40,37 @@ PyDoc_STRVAR(locale__doc__, "Support for POSIX locales."); -static PyObject *Error; + +typedef struct { + PyObject *Error; +} _localestate; + +#define _locale_state(o) ((_localestate *)PyModule_GetState(o)) + +static int +_locale_clear(PyObject *m) +{ + Py_CLEAR(_locale_state(m)->Error); + return 0; +} + +static int +_locale_traverse(PyObject *m, visitproc visit, void *arg) +{ + Py_VISIT(_locale_state(m)->Error); + return 0; +} + +static void +_locale_free(void *m) +{ + _locale_clear((PyObject *)m); +} + +static PyModuleDef _localemodule; + +#define _localestate_global ((_localestate *) \ + PyModule_GetState(PyState_FindModule(&_localemodule))) /* support functions for formatting floating point numbers */ @@ -99,7 +129,7 @@ #if defined(MS_WINDOWS) if (category < LC_MIN || category > LC_MAX) { - PyErr_SetString(Error, "invalid locale category"); + PyErr_SetString(_localestate_global->Error, "invalid locale category"); return NULL; } #endif @@ -109,7 +139,7 @@ result = setlocale(category, locale); if (!result) { /* operation failed, no setting was changed */ - PyErr_SetString(Error, "unsupported locale setting"); + PyErr_SetString(_localestate_global->Error, "unsupported locale setting"); return NULL; } result_object = PyUnicode_DecodeLocale(result, NULL); @@ -119,7 +149,7 @@ /* get locale */ result = setlocale(category, NULL); if (!result) { - PyErr_SetString(Error, "locale query failed"); + PyErr_SetString(_localestate_global->Error, "locale query failed"); return NULL; } result_object = PyUnicode_DecodeLocale(result, NULL); @@ -519,7 +549,7 @@ if (!PyArg_ParseTuple(args, "sO", &domain, &dirname_obj)) return 0; if (!strlen(domain)) { - PyErr_SetString(Error, "domain must be a non-empty string"); + PyErr_SetString(_localestate_global->Error, "domain must be a non-empty string"); return 0; } if (dirname_obj != Py_None) { @@ -605,12 +635,12 @@ PyModuleDef_HEAD_INIT, "_locale", locale__doc__, - -1, + sizeof(_localestate), PyLocale_Methods, NULL, - NULL, - NULL, - NULL + _locale_traverse, + _locale_clear, + _locale_free }; PyMODINIT_FUNC @@ -623,7 +653,7 @@ m = PyModule_Create(&_localemodule); if (m == NULL) - return NULL; + return NULL; d = PyModule_GetDict(m); @@ -661,8 +691,8 @@ PyDict_SetItemString(d, "CHAR_MAX", x); Py_XDECREF(x); - Error = PyErr_NewException("locale.Error", NULL, NULL); - PyDict_SetItemString(d, "Error", Error); + _locale_state(m)->Error = PyErr_NewException("locale.Error", NULL, NULL); + PyDict_SetItemString(d, "Error", _locale_state(m)->Error); #ifdef HAVE_LANGINFO_H for (i = 0; langinfo_constants[i].name; i++) {