Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions Lib/ctypes/test/test_struct_fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,12 @@ class Y(X):
Y._fields_ = []
self.assertRaises(AttributeError, setattr, X, "_fields_", [])

def test_5(self):
class X(Structure):
_fields_ = [("x", c_int)]
CField = type(X.x)
self.assertRaises(TypeError, CField)

# __set__ and __get__ should raise a TypeError in case their self
# argument is not a ctype instance.
def test___set__(self):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Remove the ``PyCField_new`` which user cannot call it directly.
11 changes: 2 additions & 9 deletions Modules/_ctypes/cfield.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,6 @@ static void pymem_destructor(PyObject *ptr)
/*
PyCField_Type
*/
static PyObject *
PyCField_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
CFieldObject *obj;
obj = (CFieldObject *)type->tp_alloc(type, 0);
return (PyObject *)obj;
}

/*
* Expects the size, index and offset for the current field in *psize and
Expand Down Expand Up @@ -60,7 +53,7 @@ PyCField_FromDesc(PyObject *desc, Py_ssize_t index,
#define CONT_BITFIELD 2
#define EXPAND_BITFIELD 3

self = (CFieldObject *)_PyObject_CallNoArg((PyObject *)&PyCField_Type);
self = (CFieldObject *)PyCField_Type.tp_alloc((PyTypeObject *)&PyCField_Type, 0);
if (self == NULL)
return NULL;
dict = PyType_stgdict(desc);
Expand Down Expand Up @@ -336,7 +329,7 @@ PyTypeObject PyCField_Type = {
0, /* tp_dictoffset */
0, /* tp_init */
0, /* tp_alloc */
PyCField_new, /* tp_new */
0, /* tp_new */
0, /* tp_free */
};

Expand Down
2 changes: 1 addition & 1 deletion Modules/_ctypes/stgdict.c
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ MakeFields(PyObject *type, CFieldObject *descr,
}
continue;
}
new_descr = (CFieldObject *)_PyObject_CallNoArg((PyObject *)&PyCField_Type);
new_descr = (CFieldObject *)PyCField_Type.tp_alloc((PyTypeObject *)&PyCField_Type, 0);
if (new_descr == NULL) {
Py_DECREF(fdescr);
Py_DECREF(fieldlist);
Expand Down