Add `_PyObject_VisitType` in place of `tp_traverse` functions that only visit the object's type.
PyAPI_FUNC(void) PyUnstable_EnableTryIncRef(PyObject *);
PyAPI_FUNC(int) PyUnstable_Object_IsUniquelyReferenced(PyObject *);
+
+/* Utility for the tp_traverse slot of mutable heap types that have no other
+ * references. */
+PyAPI_FUNC(int) _PyObject_VisitType(PyObject *op, visitproc visit, void *arg);
}
/* Methods */
-static int
-dbm_traverse(PyObject *dp, visitproc visit, void *arg)
-{
- Py_VISIT(Py_TYPE(dp));
- return 0;
-}
static void
dbm_dealloc(PyObject *self)
static PyType_Slot dbmtype_spec_slots[] = {
{Py_tp_dealloc, dbm_dealloc},
- {Py_tp_traverse, dbm_traverse},
+ {Py_tp_traverse, _PyObject_VisitType},
{Py_tp_methods, dbm_methods},
{Py_sq_contains, dbm_contains},
{Py_mp_length, dbm_length},
return 0;
}
-static int
-signaldict_traverse(PyObject *self, visitproc visit, void *arg)
-{
- Py_VISIT(Py_TYPE(self));
- return 0;
-}
-
static void
signaldict_dealloc(PyObject *self)
{
static PyType_Slot signaldict_slots[] = {
{Py_tp_dealloc, signaldict_dealloc},
- {Py_tp_traverse, signaldict_traverse},
+ {Py_tp_traverse, _PyObject_VisitType},
{Py_tp_repr, signaldict_repr},
{Py_tp_hash, PyObject_HashNotImplemented},
{Py_tp_getattro, PyObject_GenericGetAttr},
}
#define dec_alloc(st) PyDecType_New(st, (st)->PyDec_Type)
-static int
-dec_traverse(PyObject *dec, visitproc visit, void *arg)
-{
- Py_VISIT(Py_TYPE(dec));
- return 0;
-}
-
static void
dec_dealloc(PyObject *dec)
{
{Py_tp_token, Py_TP_USE_SPEC},
{Py_tp_dealloc, dec_dealloc},
{Py_tp_getattro, PyObject_GenericGetAttr},
- {Py_tp_traverse, dec_traverse},
+ {Py_tp_traverse, _PyObject_VisitType},
{Py_tp_repr, dec_repr},
{Py_tp_hash, dec_hash},
{Py_tp_str, dec_str},
return placeholder;
}
-static int
-placeholder_traverse(PyObject *self, visitproc visit, void *arg)
-{
- Py_VISIT(Py_TYPE(self));
- return 0;
-}
-
static PyType_Slot placeholder_type_slots[] = {
{Py_tp_dealloc, placeholder_dealloc},
{Py_tp_repr, placeholder_repr},
{Py_tp_doc, (void *)placeholder_doc},
{Py_tp_methods, placeholder_methods},
{Py_tp_new, placeholder_new},
- {Py_tp_traverse, placeholder_traverse},
+ {Py_tp_traverse, _PyObject_VisitType},
{0, 0}
};
}
/* Methods */
-static int
-gdbm_traverse(PyObject *op, visitproc visit, void *arg)
-{
- Py_VISIT(Py_TYPE(op));
- return 0;
-}
-
static void
gdbm_dealloc(PyObject *op)
{
static PyType_Slot gdbmtype_spec_slots[] = {
{Py_tp_dealloc, gdbm_dealloc},
- {Py_tp_traverse, gdbm_traverse},
+ {Py_tp_traverse, _PyObject_VisitType},
{Py_tp_methods, gdbm_methods},
{Py_sq_contains, gdbm_contains},
{Py_mp_length, gdbm_length},
return _multiprocessing_SemLock_release_impl(self);
}
-static int
-semlock_traverse(PyObject *s, visitproc visit, void *arg)
-{
- Py_VISIT(Py_TYPE(s));
- return 0;
-}
-
/*
* Semaphore methods
*/
{Py_tp_members, semlock_members},
{Py_tp_alloc, PyType_GenericAlloc},
{Py_tp_new, _multiprocessing_SemLock},
- {Py_tp_traverse, semlock_traverse},
+ {Py_tp_traverse, _PyObject_VisitType},
{Py_tp_free, PyObject_GC_Del},
{Py_tp_doc, (void *)PyDoc_STR("Semaphore/Mutex type")},
{0, 0},
#define Pdata_CAST(op) ((Pdata *)(op))
-static int
-Pdata_traverse(PyObject *self, visitproc visit, void *arg)
-{
- Py_VISIT(Py_TYPE(self));
- return 0;
-}
-
static void
Pdata_dealloc(PyObject *op)
{
static PyType_Slot pdata_slots[] = {
{Py_tp_dealloc, Pdata_dealloc},
- {Py_tp_traverse, Pdata_traverse},
+ {Py_tp_traverse, _PyObject_VisitType},
{0, NULL},
};
return 0;
}
-static int
-pysqlite_prepare_protocol_traverse(PyObject *self, visitproc visit, void *arg)
-{
- Py_VISIT(Py_TYPE(self));
- return 0;
-}
-
static void
pysqlite_prepare_protocol_dealloc(PyObject *self)
{
static PyType_Slot type_slots[] = {
{Py_tp_dealloc, pysqlite_prepare_protocol_dealloc},
{Py_tp_init, pysqlite_prepare_protocol_init},
- {Py_tp_traverse, pysqlite_prepare_protocol_traverse},
+ {Py_tp_traverse, _PyObject_VisitType},
{Py_tp_doc, (void *)doc},
{0, NULL},
};
Py_DECREF(tp);
}
-static int
-stmt_traverse(PyObject *self, visitproc visit, void *arg)
-{
- Py_VISIT(Py_TYPE(self));
- return 0;
-}
-
/*
* Strip leading whitespace and comments from incoming SQL (null terminated C
* string) and return a pointer to the first non-whitespace, non-comment
static PyType_Slot stmt_slots[] = {
{Py_tp_dealloc, stmt_dealloc},
- {Py_tp_traverse, stmt_traverse},
+ {Py_tp_traverse, _PyObject_VisitType},
{0, NULL},
};
return (PyObject *) self;
}
-static int
-memory_bio_traverse(PyObject *self, visitproc visit, void *arg)
-{
- Py_VISIT(Py_TYPE(self));
- return 0;
-}
-
static void
memory_bio_dealloc(PyObject *op)
{
{Py_tp_getset, memory_bio_getsetlist},
{Py_tp_new, _ssl_MemoryBIO},
{Py_tp_dealloc, memory_bio_dealloc},
- {Py_tp_traverse, memory_bio_traverse},
+ {Py_tp_traverse, _PyObject_VisitType},
{0, 0},
};
return (PyObject *)PyThreadHandleObject_new(type);
}
-static int
-PyThreadHandleObject_traverse(PyObject *self, visitproc visit, void *arg)
-{
- Py_VISIT(Py_TYPE(self));
- return 0;
-}
-
static void
PyThreadHandleObject_dealloc(PyObject *op)
{
{Py_tp_dealloc, PyThreadHandleObject_dealloc},
{Py_tp_repr, PyThreadHandleObject_repr},
{Py_tp_getset, ThreadHandle_getsetlist},
- {Py_tp_traverse, PyThreadHandleObject_traverse},
+ {Py_tp_traverse, _PyObject_VisitType},
{Py_tp_methods, ThreadHandle_methods},
{Py_tp_new, PyThreadHandleObject_tp_new},
{0, 0}
/* Lock objects */
-static int
-lock_traverse(PyObject *self, visitproc visit, void *arg)
-{
- Py_VISIT(Py_TYPE(self));
- return 0;
-}
-
static void
lock_dealloc(PyObject *self)
{
{Py_tp_repr, lock_repr},
{Py_tp_doc, (void *)lock_doc},
{Py_tp_methods, lock_methods},
- {Py_tp_traverse, lock_traverse},
+ {Py_tp_traverse, _PyObject_VisitType},
{Py_tp_new, lock_new},
{0, 0}
};
/* Recursive lock objects */
-static int
-rlock_traverse(PyObject *self, visitproc visit, void *arg)
-{
- Py_VISIT(Py_TYPE(self));
- return 0;
-}
-
static int
rlock_locked_impl(rlockobject *self)
{
{Py_tp_methods, rlock_methods},
{Py_tp_alloc, PyType_GenericAlloc},
{Py_tp_new, rlock_new},
- {Py_tp_traverse, rlock_traverse},
+ {Py_tp_traverse, _PyObject_VisitType},
{0, 0},
};
}
/* Methods */
-
-static int
-array_tp_traverse(PyObject *op, visitproc visit, void *arg)
-{
- Py_VISIT(Py_TYPE(op));
- return 0;
-}
-
static void
array_dealloc(PyObject *op)
{
{Py_tp_getset, array_getsets},
{Py_tp_alloc, PyType_GenericAlloc},
{Py_tp_new, array_new},
- {Py_tp_traverse, array_tp_traverse},
+ {Py_tp_traverse, _PyObject_VisitType},
/* as sequence */
{Py_sq_length, array_length},
Py_DECREF(type);
}
-static int
-py_blake2_traverse(PyObject *self, visitproc visit, void *arg)
-{
- Py_VISIT(Py_TYPE(self));
- return 0;
-}
-
static PyType_Slot blake2b_type_slots[] = {
{Py_tp_clear, py_blake2_clear},
{Py_tp_dealloc, py_blake2_dealloc},
- {Py_tp_traverse, py_blake2_traverse},
+ {Py_tp_traverse, _PyObject_VisitType},
{Py_tp_doc, (char *)py_blake2b_new__doc__},
{Py_tp_methods, py_blake2b_methods},
{Py_tp_getset, py_blake2b_getsetters},
static PyType_Slot blake2s_type_slots[] = {
{Py_tp_clear, py_blake2_clear},
{Py_tp_dealloc, py_blake2_dealloc},
- {Py_tp_traverse, py_blake2_traverse},
+ {Py_tp_traverse, _PyObject_VisitType},
{Py_tp_doc, (char *)py_blake2s_new__doc__},
{Py_tp_methods, py_blake2b_methods},
{Py_tp_getset, py_blake2b_getsetters},
Py_DECREF(type);
}
-static int
-HMACObject_traverse(PyObject *op, visitproc visit, void *arg)
-{
- Py_VISIT(Py_TYPE(op));
- return 0;
-}
-
static PyMethodDef HMACObject_methods[] = {
_HMAC_HMAC_COPY_METHODDEF
_HMAC_HMAC_UPDATE_METHODDEF
{Py_tp_getset, HMACObject_getsets},
{Py_tp_clear, HMACObject_clear},
{Py_tp_dealloc, HMACObject_dealloc},
- {Py_tp_traverse, HMACObject_traverse},
+ {Py_tp_traverse, _PyObject_VisitType},
{0, NULL} /* sentinel */
};
}
/* Internal methods for a hash object */
-static int
-MD5_traverse(PyObject *ptr, visitproc visit, void *arg)
-{
- Py_VISIT(Py_TYPE(ptr));
- return 0;
-}
-
static void
MD5_dealloc(PyObject *op)
{
{Py_tp_dealloc, MD5_dealloc},
{Py_tp_methods, MD5_methods},
{Py_tp_getset, MD5_getseters},
- {Py_tp_traverse, MD5_traverse},
+ {Py_tp_traverse, _PyObject_VisitType},
{0,0}
};
#define mmap_object_CAST(op) ((mmap_object *)(op))
-static int
-mmap_object_traverse(PyObject *op, visitproc visit, void *arg)
-{
- Py_VISIT(Py_TYPE(op));
- return 0;
-}
-
static void
mmap_object_dealloc(PyObject *op)
{
{Py_tp_members, mmap_object_members},
{Py_tp_getset, mmap_object_getset},
{Py_tp_getattro, PyObject_GenericGetAttr},
- {Py_tp_traverse, mmap_object_traverse},
+ {Py_tp_traverse, _PyObject_VisitType},
/* as sequence */
{Py_sq_length, mmap_length},
/* Internal methods for a hash object */
-static int
-SHA1_traverse(PyObject *ptr, visitproc visit, void *arg)
-{
- Py_VISIT(Py_TYPE(ptr));
- return 0;
-}
-
static void
SHA1_dealloc(PyObject *op)
{
{Py_tp_dealloc, SHA1_dealloc},
{Py_tp_methods, SHA1_methods},
{Py_tp_getset, SHA1_getseters},
- {Py_tp_traverse, SHA1_traverse},
+ {Py_tp_traverse, _PyObject_VisitType},
{0,0}
};
}
/* Internal methods for our hash objects. */
-
-static int
-SHA2_traverse(PyObject *ptr, visitproc visit, void *arg)
-{
- Py_VISIT(Py_TYPE(ptr));
- return 0;
-}
-
static void
SHA256_dealloc(PyObject *op)
{
{Py_tp_dealloc, SHA256_dealloc},
{Py_tp_methods, SHA256_methods},
{Py_tp_getset, SHA256_getseters},
- {Py_tp_traverse, SHA2_traverse},
+ {Py_tp_traverse, _PyObject_VisitType},
{0,0}
};
{Py_tp_dealloc, SHA512_dealloc},
{Py_tp_methods, SHA512_methods},
{Py_tp_getset, SHA512_getseters},
- {Py_tp_traverse, SHA2_traverse},
+ {Py_tp_traverse, _PyObject_VisitType},
{0,0}
};
Py_DECREF(tp);
}
-static int
-SHA3_traverse(PyObject *self, visitproc visit, void *arg)
-{
- Py_VISIT(Py_TYPE(self));
- return 0;
-}
-
/* External methods for a hash object */
static PyType_Slot type_slots_obj[] = { \
{Py_tp_clear, SHA3_clear}, \
{Py_tp_dealloc, SHA3_dealloc}, \
- {Py_tp_traverse, SHA3_traverse}, \
+ {Py_tp_traverse, _PyObject_VisitType}, \
{Py_tp_doc, (char*)type_doc}, \
{Py_tp_methods, type_methods}, \
{Py_tp_getset, type_getseters}, \
PyErr_SetRaisedException(exc);
}
-static int
-sock_traverse(PyObject *s, visitproc visit, void *arg)
-{
- Py_VISIT(Py_TYPE(s));
- return 0;
-}
-
static void
sock_dealloc(PyObject *s)
{
static PyType_Slot sock_slots[] = {
{Py_tp_dealloc, sock_dealloc},
- {Py_tp_traverse, sock_traverse},
+ {Py_tp_traverse, _PyObject_VisitType},
{Py_tp_repr, sock_repr},
{Py_tp_doc, (void *)sock_doc},
{Py_tp_methods, sock_methods},
{NULL, NULL} /* sentinel */
};
-static int
-ucd_traverse(PyObject *self, visitproc visit, void *arg)
-{
- Py_VISIT(Py_TYPE(self));
- return 0;
-}
-
static void
ucd_dealloc(PyObject *self)
{
static PyType_Slot ucd_type_slots[] = {
{Py_tp_dealloc, ucd_dealloc},
- {Py_tp_traverse, ucd_traverse},
+ {Py_tp_traverse, _PyObject_VisitType},
{Py_tp_getattro, PyObject_GenericGetAttr},
{Py_tp_methods, unicodedata_functions},
{Py_tp_members, DB_members},
assert(op != NULL);
return _PyObject_IsUniquelyReferenced(op);
}
+
+int
+_PyObject_VisitType(PyObject *op, visitproc visit, void *arg)
+{
+ assert(op != NULL);
+ PyTypeObject *tp = Py_TYPE(op);
+ _PyObject_ASSERT((PyObject *)tp, PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE));
+ Py_VISIT(tp);
+ return 0;
+}
Py_DECREF(tp);
}
-static int
-generic_traverse(PyObject *self, visitproc visit, void *arg)
-{
- Py_VISIT(Py_TYPE(self));
- return 0;
-}
-
static PyType_Slot generic_slots[] = {
{Py_tp_doc, (void *)generic_doc},
{Py_tp_methods, generic_methods},
{Py_tp_dealloc, generic_dealloc},
{Py_tp_alloc, PyType_GenericAlloc},
{Py_tp_free, PyObject_GC_Del},
- {Py_tp_traverse, generic_traverse},
+ {Py_tp_traverse, _PyObject_VisitType},
{0, NULL},
};
Py_DECREF(tp);
}
-static int
-PyHKEY_traverseFunc(PyObject *self, visitproc visit, void *arg)
-{
- Py_VISIT(Py_TYPE(self));
- return 0;
-}
-
static int
PyHKEY_boolFunc(PyObject *ob)
{
{Py_tp_members, PyHKEY_memberlist},
{Py_tp_methods, PyHKEY_methods},
{Py_tp_doc, (char *)PyHKEY_doc},
- {Py_tp_traverse, PyHKEY_traverseFunc},
+ {Py_tp_traverse, _PyObject_VisitType},
{Py_tp_hash, PyHKEY_hashFunc},
{Py_tp_str, PyHKEY_strFunc},