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