/opt/imh/python3.13/include/python3.13/cpython
NameSizeModeActions
abstract.h33990644editdlrm
bytearrayobject.h11630644editdlrm
bytesobject.h11800644editdlrm
cellobject.h10760644editdlrm
ceval.h11150644editdlrm
classobject.h22450644editdlrm
code.h152070644editdlrm
compile.h21210644editdlrm
complexobject.h9090644editdlrm
context.h18370644editdlrm
critical_section.h55880644editdlrm
descrobject.h15930644editdlrm
dictobject.h38700644editdlrm
fileobject.h6520644editdlrm
fileutils.h2320644editdlrm
floatobject.h9000644editdlrm
frameobject.h11990644editdlrm
funcobject.h70490644editdlrm
genobject.h29970644editdlrm
import.h7250644editdlrm
initconfig.h81970644editdlrm
listobject.h18010644editdlrm
lock.h17630644editdlrm
longintrepr.h51190644editdlrm
longobject.h55830644editdlrm
memoryobject.h22230644editdlrm
methodobject.h22760644editdlrm
modsupport.h10420644editdlrm
monitoring.h77040644editdlrm
object.h190740644editdlrm
objimpl.h38200644editdlrm
odictobject.h13110644editdlrm
picklebufobject.h8480644editdlrm
pthread_stubs.h39260644editdlrm
pyatomic.h165060644editdlrm
pyatomic_gcc.h191310644editdlrm
pyatomic_msc.h292410644editdlrm
pyatomic_std.h243360644editdlrm
pyctype.h13870644editdlrm
pydebug.h14130644editdlrm
pyerrors.h29080644editdlrm
pyfpe.h4440644editdlrm
pyframe.h19470644editdlrm
pyhash.h13820644editdlrm
pylifecycle.h28170644editdlrm
pymem.h28430644editdlrm
pystate.h94650644editdlrm
pystats.h54340644editdlrm
pythonrun.h43270644editdlrm
pythread.h15100644editdlrm
pytime.h7070644editdlrm
setobject.h20460644editdlrm
sysmodule.h7750644editdlrm
traceback.h2820644editdlrm
tracemalloc.h8230644editdlrm
tupleobject.h13290644editdlrm
unicodeobject.h250740644editdlrm
warnings.h6950644editdlrm
weakrefobject.h22490644editdlrm
Edit: /opt/imh/python3.13/include/python3.13/cpython/objimpl.h (3820B)
#ifndef Py_CPYTHON_OBJIMPL_H # error "this header file must not be included directly" #endif static inline size_t _PyObject_SIZE(PyTypeObject *type) { return _Py_STATIC_CAST(size_t, type->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 static inline size_t _PyObject_VAR_SIZE(PyTypeObject *type, Py_ssize_t nitems) { size_t size = _Py_STATIC_CAST(size_t, type->tp_basicsize); size += _Py_STATIC_CAST(size_t, nitems) * _Py_STATIC_CAST(size_t, type->tp_itemsize); return _Py_SIZE_ROUND_UP(size, 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. */ 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); // Test if a type supports weak references PyAPI_FUNC(int) PyType_SUPPORTS_WEAKREFS(PyTypeObject *type); PyAPI_FUNC(PyObject **) PyObject_GET_WEAKREFS_LISTPTR(PyObject *op); PyAPI_FUNC(PyObject *) PyUnstable_Object_GC_NewWithExtraData(PyTypeObject *, size_t); /* Visit all live GC-capable objects, similar to gc.get_objects(None). The * supplied callback is called on every such object with the void* arg set * to the supplied arg. Returning 0 from the callback ends iteration, returning * 1 allows iteration to continue. Returning any other value may result in * undefined behaviour. * * If new objects are (de)allocated by the callback it is undefined if they * will be visited. * Garbage collection is disabled during operation. Explicitly running a * collection in the callback may lead to undefined behaviour e.g. visiting the * same objects multiple times or not at all. */ typedef int (*gcvisitobjects_t)(PyObject*, void*); PyAPI_FUNC(void) PyUnstable_GC_VisitObjects(gcvisitobjects_t callback, void* arg);