Team Ai
Datasetpublic

codekingpro/portable-devtools

sourceHugging Faceupdated 5mo agoView on Hugging Face
1likes15kdownloads
object.h494 linesDownload Raw Back to cpython
1#ifndef Py_CPYTHON_OBJECT_H2#  error "this header file must not be included directly"3#endif4 5PyAPI_FUNC(void) _Py_NewReference(PyObject *op);6PyAPI_FUNC(void) _Py_NewReferenceNoTotal(PyObject *op);7PyAPI_FUNC(void) _Py_ResurrectReference(PyObject *op);8PyAPI_FUNC(void) _Py_ForgetReference(PyObject *op);9 10#ifdef Py_REF_DEBUG11/* These are useful as debugging aids when chasing down refleaks. */12PyAPI_FUNC(Py_ssize_t) _Py_GetGlobalRefTotal(void);13#  define _Py_GetRefTotal() _Py_GetGlobalRefTotal()14PyAPI_FUNC(Py_ssize_t) _Py_GetLegacyRefTotal(void);15PyAPI_FUNC(Py_ssize_t) _PyInterpreterState_GetRefTotal(PyInterpreterState *);16#endif17 18 19/********************* String Literals ****************************************/20/* This structure helps managing static strings. The basic usage goes like this:21   Instead of doing22 23       r = PyObject_CallMethod(o, "foo", "args", ...);24 25   do26 27       _Py_IDENTIFIER(foo);28       ...29       r = _PyObject_CallMethodId(o, &PyId_foo, "args", ...);30 31   PyId_foo is a static variable, either on block level or file level. On first32   usage, the string "foo" is interned, and the structures are linked. On interpreter33   shutdown, all strings are released.34 35   Alternatively, _Py_static_string allows choosing the variable name.36   _PyUnicode_FromId returns a borrowed reference to the interned string.37   _PyObject_{Get,Set,Has}AttrId are __getattr__ versions using _Py_Identifier*.38*/39typedef struct _Py_Identifier {40    const char* string;41    // Index in PyInterpreterState.unicode.ids.array. It is process-wide42    // unique and must be initialized to -1.43    Py_ssize_t index;44    // Hidden PyMutex struct for non free-threaded build.45    struct {46        uint8_t v;47    } mutex;48} _Py_Identifier;49 50#ifndef Py_BUILD_CORE51// For now we are keeping _Py_IDENTIFIER for continued use52// in non-builtin extensions (and naughty PyPI modules).53 54#define _Py_static_string_init(value) { .string = (value), .index = -1 }55#define _Py_static_string(varname, value)  static _Py_Identifier varname = _Py_static_string_init(value)56#define _Py_IDENTIFIER(varname) _Py_static_string(PyId_##varname, #varname)57 58#endif /* !Py_BUILD_CORE */59 60 61typedef struct {62    /* Number implementations must check *both*63       arguments for proper type and implement the necessary conversions64       in the slot functions themselves. */65 66    binaryfunc nb_add;67    binaryfunc nb_subtract;68    binaryfunc nb_multiply;69    binaryfunc nb_remainder;70    binaryfunc nb_divmod;71    ternaryfunc nb_power;72    unaryfunc nb_negative;73    unaryfunc nb_positive;74    unaryfunc nb_absolute;75    inquiry nb_bool;76    unaryfunc nb_invert;77    binaryfunc nb_lshift;78    binaryfunc nb_rshift;79    binaryfunc nb_and;80    binaryfunc nb_xor;81    binaryfunc nb_or;82    unaryfunc nb_int;83    void *nb_reserved;  /* the slot formerly known as nb_long */84    unaryfunc nb_float;85 86    binaryfunc nb_inplace_add;87    binaryfunc nb_inplace_subtract;88    binaryfunc nb_inplace_multiply;89    binaryfunc nb_inplace_remainder;90    ternaryfunc nb_inplace_power;91    binaryfunc nb_inplace_lshift;92    binaryfunc nb_inplace_rshift;93    binaryfunc nb_inplace_and;94    binaryfunc nb_inplace_xor;95    binaryfunc nb_inplace_or;96 97    binaryfunc nb_floor_divide;98    binaryfunc nb_true_divide;99    binaryfunc nb_inplace_floor_divide;100    binaryfunc nb_inplace_true_divide;101 102    unaryfunc nb_index;103 104    binaryfunc nb_matrix_multiply;105    binaryfunc nb_inplace_matrix_multiply;106} PyNumberMethods;107 108typedef struct {109    lenfunc sq_length;110    binaryfunc sq_concat;111    ssizeargfunc sq_repeat;112    ssizeargfunc sq_item;113    void *was_sq_slice;114    ssizeobjargproc sq_ass_item;115    void *was_sq_ass_slice;116    objobjproc sq_contains;117 118    binaryfunc sq_inplace_concat;119    ssizeargfunc sq_inplace_repeat;120} PySequenceMethods;121 122typedef struct {123    lenfunc mp_length;124    binaryfunc mp_subscript;125    objobjargproc mp_ass_subscript;126} PyMappingMethods;127 128typedef PySendResult (*sendfunc)(PyObject *iter, PyObject *value, PyObject **result);129 130typedef struct {131    unaryfunc am_await;132    unaryfunc am_aiter;133    unaryfunc am_anext;134    sendfunc am_send;135} PyAsyncMethods;136 137typedef struct {138     getbufferproc bf_getbuffer;139     releasebufferproc bf_releasebuffer;140} PyBufferProcs;141 142/* Allow printfunc in the tp_vectorcall_offset slot for143 * backwards-compatibility */144typedef Py_ssize_t printfunc;145 146// If this structure is modified, Doc/includes/typestruct.h should be updated147// as well.148struct _typeobject {149    PyObject_VAR_HEAD150    const char *tp_name; /* For printing, in format "<module>.<name>" */151    Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */152 153    /* Methods to implement standard operations */154 155    destructor tp_dealloc;156    Py_ssize_t tp_vectorcall_offset;157    getattrfunc tp_getattr;158    setattrfunc tp_setattr;159    PyAsyncMethods *tp_as_async; /* formerly known as tp_compare (Python 2)160                                    or tp_reserved (Python 3) */161    reprfunc tp_repr;162 163    /* Method suites for standard classes */164 165    PyNumberMethods *tp_as_number;166    PySequenceMethods *tp_as_sequence;167    PyMappingMethods *tp_as_mapping;168 169    /* More standard operations (here for binary compatibility) */170 171    hashfunc tp_hash;172    ternaryfunc tp_call;173    reprfunc tp_str;174    getattrofunc tp_getattro;175    setattrofunc tp_setattro;176 177    /* Functions to access object as input/output buffer */178    PyBufferProcs *tp_as_buffer;179 180    /* Flags to define presence of optional/expanded features */181    unsigned long tp_flags;182 183    const char *tp_doc; /* Documentation string */184 185    /* Assigned meaning in release 2.0 */186    /* call function for all accessible objects */187    traverseproc tp_traverse;188 189    /* delete references to contained objects */190    inquiry tp_clear;191 192    /* Assigned meaning in release 2.1 */193    /* rich comparisons */194    richcmpfunc tp_richcompare;195 196    /* weak reference enabler */197    Py_ssize_t tp_weaklistoffset;198 199    /* Iterators */200    getiterfunc tp_iter;201    iternextfunc tp_iternext;202 203    /* Attribute descriptor and subclassing stuff */204    PyMethodDef *tp_methods;205    PyMemberDef *tp_members;206    PyGetSetDef *tp_getset;207    // Strong reference on a heap type, borrowed reference on a static type208    PyTypeObject *tp_base;209    PyObject *tp_dict;210    descrgetfunc tp_descr_get;211    descrsetfunc tp_descr_set;212    Py_ssize_t tp_dictoffset;213    initproc tp_init;214    allocfunc tp_alloc;215    newfunc tp_new;216    freefunc tp_free; /* Low-level free-memory routine */217    inquiry tp_is_gc; /* For PyObject_IS_GC */218    PyObject *tp_bases;219    PyObject *tp_mro; /* method resolution order */220    PyObject *tp_cache; /* no longer used */221    void *tp_subclasses;  /* for static builtin types this is an index */222    PyObject *tp_weaklist; /* not used for static builtin types */223    destructor tp_del;224 225    /* Type attribute cache version tag. Added in version 2.6.226     * If zero, the cache is invalid and must be initialized.227     */228    unsigned int tp_version_tag;229 230    destructor tp_finalize;231    vectorcallfunc tp_vectorcall;232 233    /* bitset of which type-watchers care about this type */234    unsigned char tp_watched;235 236    /* Number of tp_version_tag values used.237     * Set to _Py_ATTR_CACHE_UNUSED if the attribute cache is238     * disabled for this type (e.g. due to custom MRO entries).239     * Otherwise, limited to MAX_VERSIONS_PER_CLASS (defined elsewhere).240     */241    uint16_t tp_versions_used;242};243 244#define _Py_ATTR_CACHE_UNUSED (30000)  // (see tp_versions_used)245 246/* This struct is used by the specializer247 * It should be treated as an opaque blob248 * by code other than the specializer and interpreter. */249struct _specialization_cache {250    // In order to avoid bloating the bytecode with lots of inline caches, the251    // members of this structure have a somewhat unique contract. They are set252    // by the specialization machinery, and are invalidated by PyType_Modified.253    // The rules for using them are as follows:254    // - If getitem is non-NULL, then it is the same Python function that255    //   PyType_Lookup(cls, "__getitem__") would return.256    // - If getitem is NULL, then getitem_version is meaningless.257    // - If getitem->func_version == getitem_version, then getitem can be called258    //   with two positional arguments and no keyword arguments, and has neither259    //   *args nor **kwargs (as required by BINARY_OP_SUBSCR_GETITEM):260    PyObject *getitem;261    uint32_t getitem_version;262    PyObject *init;263};264 265/* The *real* layout of a type object when allocated on the heap */266typedef struct _heaptypeobject {267    /* Note: there's a dependency on the order of these members268       in slotptr() in typeobject.c . */269    PyTypeObject ht_type;270    PyAsyncMethods as_async;271    PyNumberMethods as_number;272    PyMappingMethods as_mapping;273    PySequenceMethods as_sequence; /* as_sequence comes after as_mapping,274                                      so that the mapping wins when both275                                      the mapping and the sequence define276                                      a given operator (e.g. __getitem__).277                                      see add_operators() in typeobject.c . */278    PyBufferProcs as_buffer;279    PyObject *ht_name, *ht_slots, *ht_qualname;280    struct _dictkeysobject *ht_cached_keys;281    PyObject *ht_module;282    char *_ht_tpname;  // Storage for "tp_name"; see PyType_FromModuleAndSpec283    void *ht_token;  // Storage for the "Py_tp_token" slot284    struct _specialization_cache _spec_cache; // For use by the specializer.285#ifdef Py_GIL_DISABLED286    Py_ssize_t unique_id;  // ID used for per-thread refcounting287#endif288    /* here are optional user slots, followed by the members. */289} PyHeapTypeObject;290 291PyAPI_FUNC(const char *) _PyType_Name(PyTypeObject *);292PyAPI_FUNC(PyObject *) _PyType_Lookup(PyTypeObject *, PyObject *);293PyAPI_FUNC(PyObject *) _PyType_LookupRef(PyTypeObject *, PyObject *);294PyAPI_FUNC(PyObject *) PyType_GetDict(PyTypeObject *);295 296PyAPI_FUNC(int) PyObject_Print(PyObject *, FILE *, int);297PyAPI_FUNC(void) _Py_BreakPoint(void);298PyAPI_FUNC(void) _PyObject_Dump(PyObject *);299 300PyAPI_FUNC(PyObject*) _PyObject_GetAttrId(PyObject *, _Py_Identifier *);301 302PyAPI_FUNC(PyObject **) _PyObject_GetDictPtr(PyObject *);303PyAPI_FUNC(void) PyObject_CallFinalizer(PyObject *);304PyAPI_FUNC(int) PyObject_CallFinalizerFromDealloc(PyObject *);305 306PyAPI_FUNC(void) PyUnstable_Object_ClearWeakRefsNoCallbacks(PyObject *);307 308/* Same as PyObject_Generic{Get,Set}Attr, but passing the attributes309   dict as the last parameter. */310PyAPI_FUNC(PyObject *)311_PyObject_GenericGetAttrWithDict(PyObject *, PyObject *, PyObject *, int);312PyAPI_FUNC(int)313_PyObject_GenericSetAttrWithDict(PyObject *, PyObject *,314                                 PyObject *, PyObject *);315 316PyAPI_FUNC(PyObject *) _PyObject_FunctionStr(PyObject *);317 318/* Safely decref `dst` and set `dst` to `src`.319 *320 * As in case of Py_CLEAR "the obvious" code can be deadly:321 *322 *     Py_DECREF(dst);323 *     dst = src;324 *325 * The safe way is:326 *327 *      Py_SETREF(dst, src);328 *329 * That arranges to set `dst` to `src` _before_ decref'ing, so that any code330 * triggered as a side-effect of `dst` getting torn down no longer believes331 * `dst` points to a valid object.332 *333 * Temporary variables are used to only evaluate macro arguments once and so334 * avoid the duplication of side effects. _Py_TYPEOF() or memcpy() is used to335 * avoid a miscompilation caused by type punning. See Py_CLEAR() comment for336 * implementation details about type punning.337 *338 * The memcpy() implementation does not emit a compiler warning if 'src' has339 * not the same type than 'src': any pointer type is accepted for 'src'.340 */341#ifdef _Py_TYPEOF342#define Py_SETREF(dst, src) \343    do { \344        _Py_TYPEOF(dst)* _tmp_dst_ptr = &(dst); \345        _Py_TYPEOF(dst) _tmp_old_dst = (*_tmp_dst_ptr); \346        *_tmp_dst_ptr = (src); \347        Py_DECREF(_tmp_old_dst); \348    } while (0)349#else350#define Py_SETREF(dst, src) \351    do { \352        PyObject **_tmp_dst_ptr = _Py_CAST(PyObject**, &(dst)); \353        PyObject *_tmp_old_dst = (*_tmp_dst_ptr); \354        PyObject *_tmp_src = _PyObject_CAST(src); \355        memcpy(_tmp_dst_ptr, &_tmp_src, sizeof(PyObject*)); \356        Py_DECREF(_tmp_old_dst); \357    } while (0)358#endif359 360/* Py_XSETREF() is a variant of Py_SETREF() that uses Py_XDECREF() instead of361 * Py_DECREF().362 */363#ifdef _Py_TYPEOF364#define Py_XSETREF(dst, src) \365    do { \366        _Py_TYPEOF(dst)* _tmp_dst_ptr = &(dst); \367        _Py_TYPEOF(dst) _tmp_old_dst = (*_tmp_dst_ptr); \368        *_tmp_dst_ptr = (src); \369        Py_XDECREF(_tmp_old_dst); \370    } while (0)371#else372#define Py_XSETREF(dst, src) \373    do { \374        PyObject **_tmp_dst_ptr = _Py_CAST(PyObject**, &(dst)); \375        PyObject *_tmp_old_dst = (*_tmp_dst_ptr); \376        PyObject *_tmp_src = _PyObject_CAST(src); \377        memcpy(_tmp_dst_ptr, &_tmp_src, sizeof(PyObject*)); \378        Py_XDECREF(_tmp_old_dst); \379    } while (0)380#endif381 382 383/* Define a pair of assertion macros:384   _PyObject_ASSERT_FROM(), _PyObject_ASSERT_WITH_MSG() and _PyObject_ASSERT().385 386   These work like the regular C assert(), in that they will abort the387   process with a message on stderr if the given condition fails to hold,388   but compile away to nothing if NDEBUG is defined.389 390   However, before aborting, Python will also try to call _PyObject_Dump() on391   the given object.  This may be of use when investigating bugs in which a392   particular object is corrupt (e.g. buggy a tp_visit method in an extension393   module breaking the garbage collector), to help locate the broken objects.394 395   The WITH_MSG variant allows you to supply an additional message that Python396   will attempt to print to stderr, after the object dump. */397#ifdef NDEBUG398   /* No debugging: compile away the assertions: */399#  define _PyObject_ASSERT_FROM(obj, expr, msg, filename, lineno, func) \400    ((void)0)401#else402   /* With debugging: generate checks: */403#  define _PyObject_ASSERT_FROM(obj, expr, msg, filename, lineno, func) \404    ((expr) \405      ? (void)(0) \406      : _PyObject_AssertFailed((obj), Py_STRINGIFY(expr), \407                               (msg), (filename), (lineno), (func)))408#endif409 410#define _PyObject_ASSERT_WITH_MSG(obj, expr, msg) \411    _PyObject_ASSERT_FROM((obj), expr, (msg), __FILE__, __LINE__, __func__)412#define _PyObject_ASSERT(obj, expr) \413    _PyObject_ASSERT_WITH_MSG((obj), expr, NULL)414 415#define _PyObject_ASSERT_FAILED_MSG(obj, msg) \416    _PyObject_AssertFailed((obj), NULL, (msg), __FILE__, __LINE__, __func__)417 418/* Declare and define _PyObject_AssertFailed() even when NDEBUG is defined,419   to avoid causing compiler/linker errors when building extensions without420   NDEBUG against a Python built with NDEBUG defined.421 422   msg, expr and function can be NULL. */423PyAPI_FUNC(void) _Py_NO_RETURN _PyObject_AssertFailed(424    PyObject *obj,425    const char *expr,426    const char *msg,427    const char *file,428    int line,429    const char *function);430 431 432PyAPI_FUNC(void) _PyTrash_thread_deposit_object(PyThreadState *tstate, PyObject *op);433PyAPI_FUNC(void) _PyTrash_thread_destroy_chain(PyThreadState *tstate);434 435PyAPI_FUNC(int) _Py_ReachedRecursionLimitWithMargin(PyThreadState *tstate, int margin_count);436 437/* For backwards compatibility with the old trashcan mechanism */438#define Py_TRASHCAN_BEGIN(op, dealloc)439#define Py_TRASHCAN_END440 441 442PyAPI_FUNC(void *) PyObject_GetItemData(PyObject *obj);443 444PyAPI_FUNC(int) PyObject_VisitManagedDict(PyObject *obj, visitproc visit, void *arg);445PyAPI_FUNC(int) _PyObject_SetManagedDict(PyObject *obj, PyObject *new_dict);446PyAPI_FUNC(void) PyObject_ClearManagedDict(PyObject *obj);447 448 449typedef int(*PyType_WatchCallback)(PyTypeObject *);450PyAPI_FUNC(int) PyType_AddWatcher(PyType_WatchCallback callback);451PyAPI_FUNC(int) PyType_ClearWatcher(int watcher_id);452PyAPI_FUNC(int) PyType_Watch(int watcher_id, PyObject *type);453PyAPI_FUNC(int) PyType_Unwatch(int watcher_id, PyObject *type);454 455/* Attempt to assign a version tag to the given type.456 *457 * Returns 1 if the type already had a valid version tag or a new one was458 * assigned, or 0 if a new tag could not be assigned.459 */460PyAPI_FUNC(int) PyUnstable_Type_AssignVersionTag(PyTypeObject *type);461 462 463typedef enum {464    PyRefTracer_CREATE = 0,465    PyRefTracer_DESTROY = 1,466} PyRefTracerEvent;467 468typedef int (*PyRefTracer)(PyObject *, PyRefTracerEvent event, void *);469PyAPI_FUNC(int) PyRefTracer_SetTracer(PyRefTracer tracer, void *data);470PyAPI_FUNC(PyRefTracer) PyRefTracer_GetTracer(void**);471 472/* Enable PEP-703 deferred reference counting on the object.473 *474 * Returns 1 if deferred reference counting was successfully enabled, and475 * 0 if the runtime ignored it. This function cannot fail.476 */477PyAPI_FUNC(int) PyUnstable_Object_EnableDeferredRefcount(PyObject *);478 479/* Determine if the object exists as a unique temporary variable on the480 * topmost frame of the interpreter.481 */482PyAPI_FUNC(int) PyUnstable_Object_IsUniqueReferencedTemporary(PyObject *);483 484/* Check whether the object is immortal. This cannot fail. */485PyAPI_FUNC(int) PyUnstable_IsImmortal(PyObject *);486 487// Increments the reference count of the object, if it's not zero.488// PyUnstable_EnableTryIncRef() should be called on the object489// before calling this function in order to avoid spurious failures.490PyAPI_FUNC(int) PyUnstable_TryIncRef(PyObject *);491PyAPI_FUNC(void) PyUnstable_EnableTryIncRef(PyObject *);492 493PyAPI_FUNC(int) PyUnstable_Object_IsUniquelyReferenced(PyObject *);494 
codekingpro/portable-devtools · Team Ai