diff --git a/dbus_bindings/conn-internal.h b/dbus_bindings/conn-internal.h index d333d271e6daa1845fcd0fe0497fab1c56b9b9c0..ae47816e39ec3eb60f8d5464a03a42c9175e83df 100644 --- a/dbus_bindings/conn-internal.h +++ b/dbus_bindings/conn-internal.h @@ -42,8 +42,10 @@ typedef struct { */ PyObject *object_paths; +#if !DBUSPY_PY_VERSION_AT_LEAST(3, 12, 0, 0) /* Weak-references list to make Connections weakly referenceable */ PyObject *weaklist; +#endif dbus_bool_t has_mainloop; } Connection; diff --git a/dbus_bindings/conn.c b/dbus_bindings/conn.c index 4aa0865ed0dc335a6828b76f0bf55b0231be1d6f..54efc49b3064bab50d09cfb8cfe817433fc2e082 100644 --- a/dbus_bindings/conn.c +++ b/dbus_bindings/conn.c @@ -238,7 +238,9 @@ DBusPyConnection_NewConsumingDBusConnection(PyTypeObject *cls, self->has_mainloop = (mainloop != Py_None); self->conn = NULL; self->filters = PyList_New(0); +#if !DBUSPY_PY_VERSION_AT_LEAST(3, 12, 0, 0) self->weaklist = NULL; +#endif if (!self->filters) goto err; self->object_paths = PyDict_New(); if (!self->object_paths) goto err; @@ -392,7 +394,10 @@ static void Connection_tp_dealloc(Connection *self) /* avoid clobbering any pending exception */ PyErr_Fetch(&et, &ev, &etb); - if (self->weaklist) { +#if !DBUSPY_PY_VERSION_AT_LEAST(3, 12, 0, 0) + if (self->weaklist) +#endif + { PyObject_ClearWeakRefs((PyObject *)self); } @@ -455,12 +460,19 @@ PyTypeObject DBusPyConnection_Type = { 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ +#if DBUSPY_PY_VERSION_AT_LEAST(3, 12, 0, 0) + Py_TPFLAGS_MANAGED_WEAKREF | +#endif Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, Connection_tp_doc, /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ +#if DBUSPY_PY_VERSION_AT_LEAST(3, 12, 0, 0) + 0, /*tp_weaklistoffset*/ +#else offsetof(Connection, weaklist), /*tp_weaklistoffset*/ +#endif 0, /*tp_iter*/ 0, /*tp_iternext*/ DBusPyConnection_tp_methods, /*tp_methods*/ diff --git a/dbus_bindings/server.c b/dbus_bindings/server.c index 3591eac4172e5bcdc50d47718569aec9619e274a..d250a1dbe2d9537bad8986159a30f27581ae903a 100644 --- a/dbus_bindings/server.c +++ b/dbus_bindings/server.c @@ -38,8 +38,10 @@ typedef struct { /* The Connection subtype for which this Server is a factory */ PyObject *conn_class; +#if !DBUSPY_PY_VERSION_AT_LEAST(3, 12, 0, 0) /* Weak-references list to make server weakly referenceable */ PyObject *weaklist; +#endif PyObject *mainloop; } Server; @@ -423,7 +425,9 @@ Server_tp_new(PyTypeObject *cls, PyObject *args, PyObject *kwargs) return NULL; } +#if !DBUSPY_PY_VERSION_AT_LEAST(3, 12, 0, 0) ((Server *)self)->weaklist = NULL; +#endif TRACE(self); return self; @@ -438,7 +442,10 @@ static void Server_tp_dealloc(Server *self) /* avoid clobbering any pending exception */ PyErr_Fetch(&et, &ev, &etb); - if (self->weaklist) { +#if !DBUSPY_PY_VERSION_AT_LEAST(3, 12, 0, 0) + if (self->weaklist) +#endif + { PyObject_ClearWeakRefs((PyObject *)self); } @@ -570,12 +577,19 @@ PyTypeObject DBusPyServer_Type = { 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ +#if DBUSPY_PY_VERSION_AT_LEAST(3, 12, 0, 0) + Py_TPFLAGS_MANAGED_WEAKREF | +#endif Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, Server_tp_doc, /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ +#if DBUSPY_PY_VERSION_AT_LEAST(3, 12, 0, 0) + 0, /*tp_weaklistoffset*/ +#else offsetof(Server, weaklist), /*tp_weaklistoffset*/ +#endif 0, /*tp_iter*/ 0, /*tp_iternext*/ DBusPyServer_tp_methods,/*tp_methods*/