Skip to content

Commit 881ba13

Browse files
committed
MAINT: Address review comments
First, use `goto fail` unconditionally, and second try to simplify the tests by relying only on ctypes private (MetaClass using) API.
1 parent 2012aaa commit 881ba13

File tree

2 files changed

+18
-68
lines changed

2 files changed

+18
-68
lines changed

Modules/_testcapimodule.c

Lines changed: 10 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424
#include <float.h>
2525
#include <signal.h>
2626

27+
#include <ffi.h> /* required by ctypes.h */
28+
#include "_ctypes/ctypes.h" /* To test metaclass inheritance */
29+
2730
#ifdef MS_WINDOWS
2831
# include <winsock2.h> /* struct timeval */
2932
#endif
@@ -1173,48 +1176,13 @@ test_get_type_name(PyObject *self, PyObject *Py_UNUSED(ignored))
11731176
}
11741177

11751178

1176-
/*
1177-
* Small helper to import abc.ABC and ctypes.Array for testing. Both
1178-
* are (incompatible) MetaClass instances. If Array is NULL it is not filled.
1179-
*/
1180-
static int
1181-
import_abc_and_array(PyObject **ABC, PyObject **Array)
1182-
{
1183-
PyObject *abc_mod = PyImport_ImportModule("abc");
1184-
if (abc_mod == NULL) {
1185-
return -1;
1186-
}
1187-
*ABC = PyObject_GetAttrString(abc_mod, "ABC");
1188-
Py_DECREF(abc_mod);
1189-
if (*ABC == NULL) {
1190-
return -1;
1191-
}
1192-
if (Array == NULL) {
1193-
return 0;
1194-
}
1195-
1196-
PyObject *ctypes_mod = PyImport_ImportModule("ctypes");
1197-
if (ctypes_mod == NULL) {
1198-
Py_CLEAR(*ABC);
1199-
return -1;
1200-
}
1201-
*Array = PyObject_GetAttrString(ctypes_mod, "Array");
1202-
Py_DECREF(ctypes_mod);
1203-
if (*Array == NULL) {
1204-
Py_CLEAR(*ABC);
1205-
return -1;
1206-
}
1207-
return 0;
1208-
}
1209-
1210-
12111179
static PyType_Slot MinimalType_slots[] = {
12121180
{0, 0},
12131181
};
12141182

12151183
static PyType_Spec MinimalType_spec = {
12161184
"_testcapi.MinimalSpecType",
1217-
0,
1185+
sizeof(CDataObject),
12181186
0,
12191187
Py_TPFLAGS_DEFAULT,
12201188
MinimalType_slots
@@ -1224,31 +1192,22 @@ static PyType_Spec MinimalType_spec = {
12241192
static PyObject *
12251193
test_from_spec_metatype_inheritance(PyObject *self, PyObject *Py_UNUSED(ignored))
12261194
{
1227-
/* Get two (incompatible) MetaTypes */
1228-
PyObject *ABC;
1229-
if (import_abc_and_array(&ABC, NULL) < 0) {
1230-
return NULL;
1231-
}
1232-
1233-
PyObject *bases = PyTuple_Pack(1, ABC);
1195+
PyObject *bases = PyTuple_Pack(1, PyCArray_Type);
12341196
if (bases == NULL) {
1235-
Py_DECREF(ABC);
12361197
return NULL;
12371198
}
1199+
12381200
PyObject *new = PyType_FromSpecWithBases(&MinimalType_spec, bases);
12391201
Py_DECREF(bases);
12401202
if (new == NULL) {
1241-
Py_DECREF(ABC);
12421203
return NULL;
12431204
}
1244-
if (Py_TYPE(new) != Py_TYPE(ABC)) {
1205+
if (Py_TYPE(new) != Py_TYPE(&PyCArray_Type)) {
12451206
PyErr_SetString(PyExc_AssertionError,
12461207
"MetaType appears not correctly inherited from ABC!");
1247-
Py_DECREF(ABC);
12481208
Py_DECREF(new);
12491209
return NULL;
12501210
}
1251-
Py_DECREF(ABC);
12521211
Py_DECREF(new);
12531212
Py_RETURN_NONE;
12541213
}
@@ -1257,19 +1216,11 @@ test_from_spec_metatype_inheritance(PyObject *self, PyObject *Py_UNUSED(ignored)
12571216
static PyObject *
12581217
test_from_spec_invalid_metatype_inheritance(PyObject *self, PyObject *Py_UNUSED(ignored))
12591218
{
1260-
/* Get two (incompatible) MetaTypes */
1261-
PyObject *ABC, *Array;
1262-
1263-
if (import_abc_and_array(&ABC, &Array) < 0) {
1264-
return NULL;
1265-
}
1266-
1267-
PyObject *bases = PyTuple_Pack(2, ABC, Array);
1268-
Py_DECREF(ABC);
1269-
Py_DECREF(Array);
1219+
PyObject *bases = PyTuple_Pack(2, PyCArray_Type, PyCFuncPtr_Type);
12701220
if (bases == NULL) {
12711221
return NULL;
12721222
}
1223+
12731224
/*
12741225
* The following should raise a TypeError due to a MetaClass conflict.
12751226
*/
@@ -1286,7 +1237,7 @@ test_from_spec_invalid_metatype_inheritance(PyObject *self, PyObject *Py_UNUSED(
12861237

12871238
PyErr_Fetch(&type, &value, &traceback);
12881239
Py_DECREF(type);
1289-
Py_XDECREF(traceback);
1240+
Py_DECREF(traceback);
12901241

12911242
meta_error_string = PyUnicode_FromString("metaclass conflict:");
12921243
if (meta_error_string == NULL) {

Objects/typeobject.c

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3360,7 +3360,7 @@ PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)
33603360
PyObject *
33613361
PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases)
33623362
{
3363-
PyHeapTypeObject *res;
3363+
PyHeapTypeObject *res = NULL;
33643364
PyObject *modname;
33653365
PyTypeObject *type, *base;
33663366
int r;
@@ -3401,7 +3401,7 @@ PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases)
34013401
if (spec->name == NULL) {
34023402
PyErr_SetString(PyExc_SystemError,
34033403
"Type spec does not define the name field.");
3404-
return NULL;
3404+
goto fail;
34053405
}
34063406

34073407
/* Adjust for empty tuple bases */
@@ -3418,11 +3418,11 @@ PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases)
34183418
if (!bases) {
34193419
bases = PyTuple_Pack(1, base);
34203420
if (!bases)
3421-
return NULL;
3421+
goto fail;
34223422
}
34233423
else if (!PyTuple_Check(bases)) {
34243424
PyErr_SetString(PyExc_SystemError, "Py_tp_bases is not a tuple");
3425-
return NULL;
3425+
goto fail;
34263426
}
34273427
else {
34283428
Py_INCREF(bases);
@@ -3431,22 +3431,21 @@ PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases)
34313431
else if (!PyTuple_Check(bases)) {
34323432
bases = PyTuple_Pack(1, bases);
34333433
if (!bases)
3434-
return NULL;
3434+
goto fail;
34353435
}
34363436
else {
34373437
Py_INCREF(bases);
34383438
}
34393439

3440-
/* NOTE: Missing API to replace `&PyType_Type` below, see bpo-15870 */
34413440
PyTypeObject *metatype = _PyType_CalculateMetaclass(&PyType_Type, bases);
34423441
if (metatype == NULL) {
34433442
Py_DECREF(bases);
3444-
return NULL;
3443+
goto fail;
34453444
}
34463445
res = (PyHeapTypeObject*)metatype->tp_alloc(metatype, nmembers);
34473446
if (res == NULL) {
34483447
Py_DECREF(bases);
3449-
return NULL;
3448+
goto fail;
34503449
}
34513450
res_start = (char*)res;
34523451

@@ -3614,7 +3613,7 @@ PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases)
36143613
return (PyObject*)res;
36153614

36163615
fail:
3617-
Py_DECREF(res);
3616+
Py_XDECREF(res);
36183617
return NULL;
36193618
}
36203619

0 commit comments

Comments
 (0)