/usr/include/python3.10/cpython
NameSizeModeActions
abstract.h140540644editdlrm
bytearrayobject.h7690644editdlrm
bytesobject.h43530644editdlrm
ceval.h14680644editdlrm
code.h75700644editdlrm
compile.h22180644editdlrm
dictobject.h37340644editdlrm
fileobject.h7230644editdlrm
fileutils.h42670644editdlrm
frameobject.h31520644editdlrm
import.h16300644editdlrm
initconfig.h75970644editdlrm
interpreteridobject.h3870644editdlrm
listobject.h12430644editdlrm
methodobject.h13990644editdlrm
object.h196130644editdlrm
objimpl.h33560644editdlrm
odictobject.h12990644editdlrm
picklebufobject.h8460644editdlrm
pyctype.h13870644editdlrm
pydebug.h10930644editdlrm
pyerrors.h54760644editdlrm
pyfpe.h4440644editdlrm
pylifecycle.h20950644editdlrm
pymem.h33790644editdlrm
pystate.h119140644editdlrm
pythonrun.h48110644editdlrm
pytime.h91960644editdlrm
sysmodule.h5060644editdlrm
traceback.h4040644editdlrm
tupleobject.h9750644editdlrm
unicodeobject.h451130644editdlrm
Edit: /usr/include/python3.10/cpython/objimpl.h (3356B)
#ifndef Py_CPYTHON_OBJIMPL_H # error "this header file must not be included directly" #endif #define _PyObject_SIZE(typeobj) ( (typeobj)->tp_basicsize ) /* _PyObject_VAR_SIZE returns the number of bytes (as size_t) allocated for a vrbl-size object with nitems items, exclusive of gc overhead (if any). The value is rounded up to the closest multiple of sizeof(void *), in order to ensure that pointer fields at the end of the object are correctly aligned for the platform (this is of special importance for subclasses of, e.g., str or int, so that pointers can be stored after the embedded data). Note that there's no memory wastage in doing this, as malloc has to return (at worst) pointer-aligned memory anyway. */ #if ((SIZEOF_VOID_P - 1) & SIZEOF_VOID_P) != 0 # error "_PyObject_VAR_SIZE requires SIZEOF_VOID_P be a power of 2" #endif #define _PyObject_VAR_SIZE(typeobj, nitems) \ _Py_SIZE_ROUND_UP((typeobj)->tp_basicsize + \ (nitems)*(typeobj)->tp_itemsize, \ SIZEOF_VOID_P) /* This example code implements an object constructor with a custom allocator, where PyObject_New is inlined, and shows the important distinction between two steps (at least): 1) the actual allocation of the object storage; 2) the initialization of the Python specific fields in this storage with PyObject_{Init, InitVar}. PyObject * YourObject_New(...) { PyObject *op; op = (PyObject *) Your_Allocator(_PyObject_SIZE(YourTypeStruct)); if (op == NULL) { return PyErr_NoMemory(); } PyObject_Init(op, &YourTypeStruct); op->ob_field = value; ... return op; } Note that in C++, the use of the new operator usually implies that the 1st step is performed automatically for you, so in a C++ class constructor you would start directly with PyObject_Init/InitVar. */ /* This function returns the number of allocated memory blocks, regardless of size */ PyAPI_FUNC(Py_ssize_t) _Py_GetAllocatedBlocks(void); /* Macros */ #ifdef WITH_PYMALLOC PyAPI_FUNC(int) _PyObject_DebugMallocStats(FILE *out); #endif typedef struct { /* user context passed as the first argument to the 2 functions */ void *ctx; /* allocate an arena of size bytes */ void* (*alloc) (void *ctx, size_t size); /* free an arena */ void (*free) (void *ctx, void *ptr, size_t size); } PyObjectArenaAllocator; /* Get the arena allocator. */ PyAPI_FUNC(void) PyObject_GetArenaAllocator(PyObjectArenaAllocator *allocator); /* Set the arena allocator. */ PyAPI_FUNC(void) PyObject_SetArenaAllocator(PyObjectArenaAllocator *allocator); /* Test if an object implements the garbage collector protocol */ PyAPI_FUNC(int) PyObject_IS_GC(PyObject *obj); /* Code built with Py_BUILD_CORE must include pycore_gc.h instead which defines a different _PyGC_FINALIZED() macro. */ #ifndef Py_BUILD_CORE // Kept for backward compatibility with Python 3.8 # define _PyGC_FINALIZED(o) PyObject_GC_IsFinalized(o) #endif PyAPI_FUNC(PyObject *) _PyObject_GC_Malloc(size_t size); PyAPI_FUNC(PyObject *) _PyObject_GC_Calloc(size_t size); /* Test if a type supports weak references */ #define PyType_SUPPORTS_WEAKREFS(t) ((t)->tp_weaklistoffset > 0) PyAPI_FUNC(PyObject **) PyObject_GET_WEAKREFS_LISTPTR(PyObject *op);