summaryrefslogtreecommitdiff
path: root/Modules/_localemodule.c
diff options
context:
space:
mode:
authorChristian Heimes <christian@python.org>2016-09-09 00:24:12 +0200
committerChristian Heimes <christian@python.org>2016-09-09 00:24:12 +0200
commitff4fddde57d5579dff3a83d99e20cd06366b10d6 (patch)
tree0ed3f055681e06dcfd5d6ce207c8bf84161e680d /Modules/_localemodule.c
parent45af0c83da093ac8f6756d98c36e064e7c01b19b (diff)
downloadcpython-git-ff4fddde57d5579dff3a83d99e20cd06366b10d6.tar.gz
Add NULL checks to the initializer of the locale module
The _locale module was using old-style APIs to set numeric module constants from macros. The new way requires less code and properly checks for NULL. CID 1295027
Diffstat (limited to 'Modules/_localemodule.c')
-rw-r--r--Modules/_localemodule.c54
1 files changed, 20 insertions, 34 deletions
diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c
index a92fb10dd2..8259180f82 100644
--- a/Modules/_localemodule.c
+++ b/Modules/_localemodule.c
@@ -621,53 +621,34 @@ static struct PyModuleDef _localemodule = {
PyMODINIT_FUNC
PyInit__locale(void)
{
- PyObject *m, *d, *x;
+ PyObject *m;
#ifdef HAVE_LANGINFO_H
int i;
#endif
m = PyModule_Create(&_localemodule);
if (m == NULL)
- return NULL;
-
- d = PyModule_GetDict(m);
-
- x = PyLong_FromLong(LC_CTYPE);
- PyDict_SetItemString(d, "LC_CTYPE", x);
- Py_XDECREF(x);
-
- x = PyLong_FromLong(LC_TIME);
- PyDict_SetItemString(d, "LC_TIME", x);
- Py_XDECREF(x);
-
- x = PyLong_FromLong(LC_COLLATE);
- PyDict_SetItemString(d, "LC_COLLATE", x);
- Py_XDECREF(x);
+ return NULL;
- x = PyLong_FromLong(LC_MONETARY);
- PyDict_SetItemString(d, "LC_MONETARY", x);
- Py_XDECREF(x);
+ PyModule_AddIntMacro(m, LC_CTYPE);
+ PyModule_AddIntMacro(m, LC_TIME);
+ PyModule_AddIntMacro(m, LC_COLLATE);
+ PyModule_AddIntMacro(m, LC_MONETARY);
#ifdef LC_MESSAGES
- x = PyLong_FromLong(LC_MESSAGES);
- PyDict_SetItemString(d, "LC_MESSAGES", x);
- Py_XDECREF(x);
+ PyModule_AddIntMacro(m, LC_MESSAGES);
#endif /* LC_MESSAGES */
- x = PyLong_FromLong(LC_NUMERIC);
- PyDict_SetItemString(d, "LC_NUMERIC", x);
- Py_XDECREF(x);
-
- x = PyLong_FromLong(LC_ALL);
- PyDict_SetItemString(d, "LC_ALL", x);
- Py_XDECREF(x);
-
- x = PyLong_FromLong(CHAR_MAX);
- PyDict_SetItemString(d, "CHAR_MAX", x);
- Py_XDECREF(x);
+ PyModule_AddIntMacro(m, LC_NUMERIC);
+ PyModule_AddIntMacro(m, LC_ALL);
+ PyModule_AddIntMacro(m, CHAR_MAX);
Error = PyErr_NewException("locale.Error", NULL, NULL);
- PyDict_SetItemString(d, "Error", Error);
+ if (Error == NULL) {
+ Py_DECREF(m);
+ return NULL;
+ }
+ PyModule_AddObject(m, "Error", Error);
#ifdef HAVE_LANGINFO_H
for (i = 0; langinfo_constants[i].name; i++) {
@@ -675,6 +656,11 @@ PyInit__locale(void)
langinfo_constants[i].value);
}
#endif
+
+ if (PyErr_Occurred()) {
+ Py_DECREF(m);
+ return NULL;
+ }
return m;
}