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) {
// 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);
}
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()
// most gc_list_* functions for it.
#define NEXT_MASK_UNREACHABLE (1)
-/* Get an object's GC head */
-#define AS_GC(o) ((PyGC_Head *)(((char *)(o))-sizeof(PyGC_Head)))
+#define AS_GC(op) _Py_AS_GC(op)
+#define FROM_GC(gc) _Py_FROM_GC(gc)
-/* Get the object given the GC head */
-#define FROM_GC(g) ((PyObject *)(((char *)(g))+sizeof(PyGC_Head)))
static inline int
gc_is_collecting(PyGC_Head *g)
* to imagine how calling it later could create a problem for us. wr
* is moved to wrcb_to_call in this case.
*/
- if (gc_is_collecting(AS_GC(wr))) {
+ if (gc_is_collecting(AS_GC((PyObject *)wr))) {
/* it should already have been cleared above */
assert(wr->wr_object == Py_None);
continue;
Py_INCREF(wr);
/* Move wr to wrcb_to_call, for the next pass. */
- wrasgc = AS_GC(wr);
+ wrasgc = AS_GC((PyObject *)wr);
assert(wrasgc != next); /* wrasgc is reachable, but
next isn't, so they can't
be the same */
gc_is_finalized(PyObject *module, PyObject *obj)
/*[clinic end generated code: output=e1516ac119a918ed input=201d0c58f69ae390]*/
{
- if (_PyObject_IS_GC(obj) && _PyGCHead_FINALIZED(AS_GC(obj))) {
+ if (_PyObject_IS_GC(obj) && _PyGC_FINALIZED(obj)) {
Py_RETURN_TRUE;
}
Py_RETURN_FALSE;
int
PyObject_GC_IsFinalized(PyObject *obj)
{
- if (_PyObject_IS_GC(obj) && _PyGCHead_FINALIZED(AS_GC(obj))) {
+ if (_PyObject_IS_GC(obj) && _PyGC_FINALIZED(obj)) {
return 1;
}
return 0;