summaryrefslogtreecommitdiffstats
path: root/Include
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2023-06-06 12:44:48 (GMT)
committerGitHub <noreply@github.com>2023-06-06 12:44:48 (GMT)
commitc7bf74bacd2b2db308e80e532153ffaf6dbca851 (patch)
treebff6836b63b54d70a62d1810ecfe9bd0000fdc83 /Include
parent963099ebd9ada501d125fc5101ae42f55967a6e8 (diff)
downloadcpython-c7bf74bacd2b2db308e80e532153ffaf6dbca851.zip
cpython-c7bf74bacd2b2db308e80e532153ffaf6dbca851.tar.gz
cpython-c7bf74bacd2b2db308e80e532153ffaf6dbca851.tar.bz2
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++.
Diffstat (limited to 'Include')
-rw-r--r--Include/internal/pycore_gc.h23
-rw-r--r--Include/internal/pycore_object.h6
2 files changed, 20 insertions, 9 deletions
diff --git a/Include/internal/pycore_gc.h b/Include/internal/pycore_gc.h
index b3abe20..2d33aa7 100644
--- a/Include/internal/pycore_gc.h
+++ b/Include/internal/pycore_gc.h
@@ -19,10 +19,21 @@ typedef struct {
uintptr_t _gc_prev;
} PyGC_Head;
+#define _PyGC_Head_UNUSED PyGC_Head
+
+
+/* Get an object's GC head */
static inline PyGC_Head* _Py_AS_GC(PyObject *op) {
- return (_Py_CAST(PyGC_Head*, op) - 1);
+ char *gc = ((char*)op) - sizeof(PyGC_Head);
+ return (PyGC_Head*)gc;
}
-#define _PyGC_Head_UNUSED PyGC_Head
+
+/* 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) {
@@ -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);
}
diff --git a/Include/internal/pycore_object.h b/Include/internal/pycore_object.h
index 0981d11..3ac7e89 100644
--- a/Include/internal/pycore_object.h
+++ b/Include/internal/pycore_object.h
@@ -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()