Skip to main content

Modules/_ctypes/_ctypes.c (part 2)

cpython 3.14 @ ab2d84fe1023/Modules/_ctypes/_ctypes.c

This annotation covers Structure layout, POINTER, byref, cast, and library loading in _ctypes.c. For the basic Simple_Type scalar types and Array see the modules_ctypes_c annotation.

Map​

LinesSymbolRole
1-600Structure._fields_ processingStructField descriptor per field, offset and size computation
601-1100Bit-field packingSub-byte field allocation following C ABI rules
1101-1600POINTER type factoryLP_* classes, contents property, byref()
1601-2200cast()Reinterpret a ctypes object as a different type
2201-5200CDLL, LibraryLoader, calling convention dispatchdlopen, function pointer, argtypes/restype

Reading​

Structure._fields_ layout​

When _fields_ is assigned, StructField_setter iterates the fields list, accumulates byte offsets according to the target platform's ABI alignment rules, and creates one StructFieldDescriptor per field. The Structure.__init__ then uses these descriptors for __getattr__/__setattr__.

// CPython: Modules/_ctypes/_ctypes.c:2480 StructField_setter
static int
StructField_setter(PyObject *self, PyObject *value, void *data)
{
...
offset = AlignUp(current_offset, stginfo->align);
...
}

byref(obj)​

byref(obj) is a faster equivalent of POINTER(type)(obj) that creates a temporary pointer without allocating a full POINTER instance. It is only valid as a function argument, not storable.

CDLL and FuncPtr​

CDLL(name) calls dlopen(name, RTLD_LOCAL|RTLD_NOW). Attribute access on the returned object creates a FuncPtr that wraps the symbol. Calling the FuncPtr invokes libffi ffi_call with the declared argtypes and restype.

gopy notes​

Not yet ported in gopy. ctypes requires libffi integration and platform ABI knowledge. It is not currently on the gopy roadmap since gopy targets pure-Python workloads. The objects/ layer does not expose C struct layout APIs.