@@ -71,6 +71,7 @@ update_bases(PyObject *bases, PyObject *const *args, Py_ssize_t nargs)
71
71
/* If this is a first successful replacement, create new_bases list and
72
72
copy previously encountered bases. */
73
73
if (!(new_bases = PyList_New (i ))) {
74
+ Py_DECREF (new_base );
74
75
goto error ;
75
76
}
76
77
for (j = 0 ; j < i ; j ++ ) {
@@ -81,6 +82,7 @@ update_bases(PyObject *bases, PyObject *const *args, Py_ssize_t nargs)
81
82
}
82
83
j = PyList_GET_SIZE (new_bases );
83
84
if (PyList_SetSlice (new_bases , j , j , new_base ) < 0 ) {
85
+ Py_DECREF (new_base );
84
86
goto error ;
85
87
}
86
88
Py_DECREF (new_base );
@@ -102,8 +104,9 @@ static PyObject *
102
104
builtin___build_class__ (PyObject * self , PyObject * const * args , Py_ssize_t nargs ,
103
105
PyObject * kwnames )
104
106
{
105
- PyObject * func , * name , * bases , * mkw , * meta , * winner , * prep , * ns , * orig_bases ;
106
- PyObject * cls = NULL , * cell = NULL ;
107
+ PyObject * func , * name , * winner , * prep ;
108
+ PyObject * cls = NULL , * cell = NULL , * ns = NULL , * meta = NULL , * orig_bases = NULL ;
109
+ PyObject * mkw = NULL , * bases = NULL ;
107
110
int isclass = 0 ; /* initialize to prevent gcc warning */
108
111
109
112
if (nargs < 2 ) {
@@ -140,26 +143,20 @@ builtin___build_class__(PyObject *self, PyObject *const *args, Py_ssize_t nargs,
140
143
else {
141
144
mkw = _PyStack_AsDict (args + nargs , kwnames );
142
145
if (mkw == NULL ) {
143
- Py_DECREF (bases );
144
- return NULL ;
146
+ goto error ;
145
147
}
146
148
147
149
meta = _PyDict_GetItemIdWithError (mkw , & PyId_metaclass );
148
150
if (meta != NULL ) {
149
151
Py_INCREF (meta );
150
152
if (_PyDict_DelItemId (mkw , & PyId_metaclass ) < 0 ) {
151
- Py_DECREF (meta );
152
- Py_DECREF (mkw );
153
- Py_DECREF (bases );
154
- return NULL ;
153
+ goto error ;
155
154
}
156
155
/* metaclass is explicitly given, check if it's indeed a class */
157
156
isclass = PyType_Check (meta );
158
157
}
159
158
else if (PyErr_Occurred ()) {
160
- Py_DECREF (mkw );
161
- Py_DECREF (bases );
162
- return NULL ;
159
+ goto error ;
163
160
}
164
161
}
165
162
if (meta == NULL ) {
@@ -182,10 +179,7 @@ builtin___build_class__(PyObject *self, PyObject *const *args, Py_ssize_t nargs,
182
179
winner = (PyObject * )_PyType_CalculateMetaclass ((PyTypeObject * )meta ,
183
180
bases );
184
181
if (winner == NULL ) {
185
- Py_DECREF (meta );
186
- Py_XDECREF (mkw );
187
- Py_DECREF (bases );
188
- return NULL ;
182
+ goto error ;
189
183
}
190
184
if (winner != meta ) {
191
185
Py_DECREF (meta );
@@ -207,10 +201,7 @@ builtin___build_class__(PyObject *self, PyObject *const *args, Py_ssize_t nargs,
207
201
Py_DECREF (prep );
208
202
}
209
203
if (ns == NULL ) {
210
- Py_DECREF (meta );
211
- Py_XDECREF (mkw );
212
- Py_DECREF (bases );
213
- return NULL ;
204
+ goto error ;
214
205
}
215
206
if (!PyMapping_Check (ns )) {
216
207
PyErr_Format (PyExc_TypeError ,
@@ -251,13 +242,13 @@ builtin___build_class__(PyObject *self, PyObject *const *args, Py_ssize_t nargs,
251
242
}
252
243
error :
253
244
Py_XDECREF (cell );
254
- Py_DECREF (ns );
255
- Py_DECREF (meta );
245
+ Py_XDECREF (ns );
246
+ Py_XDECREF (meta );
256
247
Py_XDECREF (mkw );
257
- Py_DECREF (bases );
258
248
if (bases != orig_bases ) {
259
249
Py_DECREF (orig_bases );
260
250
}
251
+ Py_DECREF (bases );
261
252
return cls ;
262
253
}
263
254
0 commit comments