@@ -2070,16 +2070,23 @@ insint(PyObject * d, char * name, long value)
2070
2070
2071
2071
#define ADD_INT (val ) insint(d, #val, val)
2072
2072
2073
- static void
2074
- inskey (PyObject * d , char * name , HKEY key )
2073
+ static int
2074
+ inskey (PyObject * mod , char * name , HKEY key )
2075
2075
{
2076
2076
PyObject * v = PyLong_FromVoidPtr (key );
2077
- if (!v || PyDict_SetItemString (d , name , v ))
2078
- PyErr_Clear ();
2079
- Py_XDECREF (v );
2077
+ if (v == NULL ) {
2078
+ return -1 ;
2079
+ }
2080
+ int rc = PyModule_AddObjectRef (name , v );
2081
+ Py_DECREF (v );
2082
+ return rc ;
2080
2083
}
2081
2084
2082
- #define ADD_KEY (val ) inskey(d, #val, val)
2085
+ #define ADD_KEY (VAL ) do { \
2086
+ if (inskey(m, #VAL, VAL) < 0) { \
2087
+ goto error; \
2088
+ } \
2089
+ } while (0)
2083
2090
2084
2091
2085
2092
static struct PyModuleDef winregmodule = {
@@ -2096,20 +2103,20 @@ static struct PyModuleDef winregmodule = {
2096
2103
2097
2104
PyMODINIT_FUNC PyInit_winreg (void )
2098
2105
{
2099
- PyObject * m , * d ;
2100
- m = PyModule_Create (& winregmodule );
2101
- if (m == NULL )
2106
+ PyObject * m = PyModule_Create (& winregmodule );
2107
+ if (m == NULL ) {
2102
2108
return NULL ;
2103
- d = PyModule_GetDict ( m );
2109
+ }
2104
2110
PyHKEY_Type .tp_doc = PyHKEY_doc ;
2105
- if (PyType_Ready (& PyHKEY_Type ) < 0 )
2106
- return NULL ;
2107
- if (PyDict_SetItemString (d , "HKEYType" ,
2108
- (PyObject * )& PyHKEY_Type ) != 0 )
2109
- return NULL ;
2110
- if (PyDict_SetItemString (d , "error" ,
2111
- PyExc_OSError ) != 0 )
2112
- return NULL ;
2111
+ if (PyType_Ready (& PyHKEY_Type ) < 0 ) {
2112
+ goto error ;
2113
+ }
2114
+ if (PyModule_AddObjectRef (m , "HKEYType" , (PyObject * )& PyHKEY_Type ) < 0 ) {
2115
+ goto error ;
2116
+ }
2117
+ if (PyModule_AddObjectRef (m , "error" , PyExc_OSError ) < 0 ) {
2118
+ goto error ;
2119
+ }
2113
2120
2114
2121
/* Add the relevant constants */
2115
2122
ADD_KEY (HKEY_CLASSES_ROOT );
@@ -2171,6 +2178,10 @@ PyMODINIT_FUNC PyInit_winreg(void)
2171
2178
ADD_INT (REG_FULL_RESOURCE_DESCRIPTOR );
2172
2179
ADD_INT (REG_RESOURCE_REQUIREMENTS_LIST );
2173
2180
return m ;
2181
+
2182
+ error :
2183
+ Py_DECREF (m );
2184
+ return NULL ;
2174
2185
}
2175
2186
2176
2187
#endif /* MS_WINDOWS_DESKTOP || MS_WINDOWS_SYSTEM || MS_WINDOWS_GAMES */
0 commit comments