bpo-42972: Fully implement GC protocol for ssl heap types (GH-26370) … · python/cpython@ea47a8a
@@ -434,11 +434,11 @@ static PyType_Slot sslerror_type_slots[] = {
434434};
435435436436static PyType_Spec sslerror_type_spec = {
437-"ssl.SSLError",
438- sizeof(PyOSErrorObject),
439-0,
440-Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_IMMUTABLETYPE,
441- sslerror_type_slots
437+.name = "ssl.SSLError",
438+.basicsize = sizeof(PyOSErrorObject),
439+.flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
440+ Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_HAVE_GC),
441+.slots = sslerror_type_slots
442442};
443443444444static void
@@ -789,7 +789,8 @@ newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock,
789789 SSL_CTX *ctx = sslctx->ctx;
790790 _PySSLError err = { 0 };
791791792- self = PyObject_New(PySSLSocket, get_state_ctx(sslctx)->PySSLSocket_Type);
792+ self = PyObject_GC_New(PySSLSocket,
793+ get_state_ctx(sslctx)->PySSLSocket_Type);
793794 if (self == NULL)
794795 return NULL;
795796@@ -896,6 +897,8 @@ newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock,
896897 return NULL;
897898 }
898899 }
900+901+ PyObject_GC_Track(self);
899902 return self;
900903}
901904@@ -2169,6 +2172,7 @@ PySSL_traverse(PySSLSocket *self, visitproc visit, void *arg)
21692172 Py_VISIT(self->exc_type);
21702173 Py_VISIT(self->exc_value);
21712174 Py_VISIT(self->exc_tb);
2175+ Py_VISIT(Py_TYPE(self));
21722176 return 0;
21732177}
21742178@@ -2185,13 +2189,15 @@ static void
21852189PySSL_dealloc(PySSLSocket *self)
21862190{
21872191 PyTypeObject *tp = Py_TYPE(self);
2188- if (self->ssl)
2192+ PyObject_GC_UnTrack(self);
2193+ if (self->ssl) {
21892194 SSL_free(self->ssl);
2195+ }
21902196 Py_XDECREF(self->Socket);
21912197 Py_XDECREF(self->ctx);
21922198 Py_XDECREF(self->server_hostname);
21932199 Py_XDECREF(self->owner);
2194-PyObject_Free(self);
2200+PyObject_GC_Del(self);
21952201 Py_DECREF(tp);
21962202}
21972203@@ -2903,11 +2909,11 @@ static PyType_Slot PySSLSocket_slots[] = {
29032909};
2904291029052911static PyType_Spec PySSLSocket_spec = {
2906-"_ssl._SSLSocket",
2907- sizeof(PySSLSocket),
2908-0,
2909-Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE,
2910- PySSLSocket_slots,
2912+.name = "_ssl._SSLSocket",
2913+.basicsize = sizeof(PySSLSocket),
2914+.flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE |
2915+ Py_TPFLAGS_HAVE_GC),
2916+.slots = PySSLSocket_slots,
29112917};
2912291829132919/*
@@ -3159,6 +3165,7 @@ context_traverse(PySSLContext *self, visitproc visit, void *arg)
31593165{
31603166 Py_VISIT(self->set_sni_cb);
31613167 Py_VISIT(self->msg_cb);
3168+ Py_VISIT(Py_TYPE(self));
31623169 return 0;
31633170}
31643171@@ -4641,11 +4648,11 @@ static PyType_Slot PySSLContext_slots[] = {
46414648};
4642464946434650static PyType_Spec PySSLContext_spec = {
4644-"_ssl._SSLContext",
4645- sizeof(PySSLContext),
4646-0,
4647-Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_IMMUTABLETYPE,
4648- PySSLContext_slots,
4651+.name = "_ssl._SSLContext",
4652+.basicsize = sizeof(PySSLContext),
4653+.flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
4654+ Py_TPFLAGS_IMMUTABLETYPE),
4655+.slots = PySSLContext_slots,
46494656};
4650465746514658@@ -4689,10 +4696,18 @@ _ssl_MemoryBIO_impl(PyTypeObject *type)
46894696 return (PyObject *) self;
46904697}
469146984699+static int
4700+memory_bio_traverse(PySSLMemoryBIO *self, visitproc visit, void *arg)
4701+{
4702+ Py_VISIT(Py_TYPE(self));
4703+ return 0;
4704+}
4705+46924706static void
46934707memory_bio_dealloc(PySSLMemoryBIO *self)
46944708{
46954709 PyTypeObject *tp = Py_TYPE(self);
4710+ PyObject_GC_UnTrack(self);
46964711 BIO_free(self->bio);
46974712 Py_TYPE(self)->tp_free(self);
46984713 Py_DECREF(tp);
@@ -4843,15 +4858,16 @@ static PyType_Slot PySSLMemoryBIO_slots[] = {
48434858 {Py_tp_getset, memory_bio_getsetlist},
48444859 {Py_tp_new, _ssl_MemoryBIO},
48454860 {Py_tp_dealloc, memory_bio_dealloc},
4861+ {Py_tp_traverse, memory_bio_traverse},
48464862 {0, 0},
48474863};
4848486448494865static PyType_Spec PySSLMemoryBIO_spec = {
4850-"_ssl.MemoryBIO",
4851- sizeof(PySSLMemoryBIO),
4852-0,
4853-Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE,
4854- PySSLMemoryBIO_slots,
4866+.name = "_ssl.MemoryBIO",
4867+.basicsize = sizeof(PySSLMemoryBIO),
4868+.flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE |
4869+ Py_TPFLAGS_HAVE_GC),
4870+.slots = PySSLMemoryBIO_slots,
48554871};
4856487248574873/*
@@ -4934,6 +4950,7 @@ static int
49344950PySSLSession_traverse(PySSLSession *self, visitproc visit, void *arg)
49354951{
49364952 Py_VISIT(self->ctx);
4953+ Py_VISIT(Py_TYPE(self));
49374954 return 0;
49384955}
49394956@@ -5022,11 +5039,11 @@ static PyType_Slot PySSLSession_slots[] = {
50225039};
5023504050245041static PyType_Spec PySSLSession_spec = {
5025-"_ssl.SSLSession",
5026- sizeof(PySSLSession),
5027-0,
5028-Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_IMMUTABLETYPE,
5029- PySSLSession_slots,
5042+.name = "_ssl.SSLSession",
5043+.basicsize = sizeof(PySSLSession),
5044+.flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
5045+ Py_TPFLAGS_IMMUTABLETYPE),
5046+.slots = PySSLSession_slots,
50305047};
5031504850325049