mirror of
https://github.com/python/cpython.git
synced 2025-11-03 19:34:08 +00:00
gh-105268: Add _Py_FROM_GC() function to pycore_gc.h (#105362)
* gcmodule.c reuses _Py_AS_GC(op) for AS_GC() * Move gcmodule.c FROM_GC() implementation to a new _Py_FROM_GC() static inline function in pycore_gc.h. * _PyObject_IS_GC(): only get the type once * gc_is_finalized(à) and PyObject_GC_IsFinalized() use _PyGC_FINALIZED(), instead of _PyGCHead_FINALIZED(). * Remove _Py_CAST() in pycore_gc.h: this header file is not built with C++.
This commit is contained in:
parent
963099ebd9
commit
c7bf74bacd
3 changed files with 27 additions and 18 deletions
|
|
@ -19,11 +19,22 @@ typedef struct {
|
|||
uintptr_t _gc_prev;
|
||||
} PyGC_Head;
|
||||
|
||||
static inline PyGC_Head* _Py_AS_GC(PyObject *op) {
|
||||
return (_Py_CAST(PyGC_Head*, op) - 1);
|
||||
}
|
||||
#define _PyGC_Head_UNUSED PyGC_Head
|
||||
|
||||
|
||||
/* Get an object's GC head */
|
||||
static inline PyGC_Head* _Py_AS_GC(PyObject *op) {
|
||||
char *gc = ((char*)op) - sizeof(PyGC_Head);
|
||||
return (PyGC_Head*)gc;
|
||||
}
|
||||
|
||||
/* Get the object given the GC head */
|
||||
static inline PyObject* _Py_FROM_GC(PyGC_Head *gc) {
|
||||
char *op = ((char *)gc) + sizeof(PyGC_Head);
|
||||
return (PyObject *)op;
|
||||
}
|
||||
|
||||
|
||||
/* True if the object is currently tracked by the GC. */
|
||||
static inline int _PyObject_GC_IS_TRACKED(PyObject *op) {
|
||||
PyGC_Head *gc = _Py_AS_GC(op);
|
||||
|
|
@ -57,19 +68,19 @@ static inline int _PyObject_GC_MAY_BE_TRACKED(PyObject *obj) {
|
|||
// But it is always 0 for normal code.
|
||||
static inline PyGC_Head* _PyGCHead_NEXT(PyGC_Head *gc) {
|
||||
uintptr_t next = gc->_gc_next;
|
||||
return _Py_CAST(PyGC_Head*, next);
|
||||
return (PyGC_Head*)next;
|
||||
}
|
||||
static inline void _PyGCHead_SET_NEXT(PyGC_Head *gc, PyGC_Head *next) {
|
||||
gc->_gc_next = _Py_CAST(uintptr_t, next);
|
||||
gc->_gc_next = (uintptr_t)next;
|
||||
}
|
||||
|
||||
// Lowest two bits of _gc_prev is used for _PyGC_PREV_MASK_* flags.
|
||||
static inline PyGC_Head* _PyGCHead_PREV(PyGC_Head *gc) {
|
||||
uintptr_t prev = (gc->_gc_prev & _PyGC_PREV_MASK);
|
||||
return _Py_CAST(PyGC_Head*, prev);
|
||||
return (PyGC_Head*)prev;
|
||||
}
|
||||
static inline void _PyGCHead_SET_PREV(PyGC_Head *gc, PyGC_Head *prev) {
|
||||
uintptr_t uprev = _Py_CAST(uintptr_t, prev);
|
||||
uintptr_t uprev = (uintptr_t)prev;
|
||||
assert((uprev & ~_PyGC_PREV_MASK) == 0);
|
||||
gc->_gc_prev = ((gc->_gc_prev & ~_PyGC_PREV_MASK) | uprev);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -326,9 +326,9 @@ _PyObject_GET_WEAKREFS_LISTPTR_FROM_OFFSET(PyObject *op)
|
|||
static inline int
|
||||
_PyObject_IS_GC(PyObject *obj)
|
||||
{
|
||||
return (PyType_IS_GC(Py_TYPE(obj))
|
||||
&& (Py_TYPE(obj)->tp_is_gc == NULL
|
||||
|| Py_TYPE(obj)->tp_is_gc(obj)));
|
||||
PyTypeObject *type = Py_TYPE(obj);
|
||||
return (PyType_IS_GC(type)
|
||||
&& (type->tp_is_gc == NULL || type->tp_is_gc(obj)));
|
||||
}
|
||||
|
||||
// Fast inlined version of PyType_IS_GC()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue