FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

gh-116946: fully implement GC protocol for `_tkinter.Tk{app,tt}Object` by picnixz · Pull Request #138331 · python/cpython · GitHub

/ cpython Public
65 changes: 52 additions & 13 deletions Modules/_tkinter.c
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Original file line number Diff line number Diff line change
Expand Up @@ -589,10 +589,11 @@ Tkapp_New(const char *screenName, const char *className,
int interactive, int wantobjects, int wantTk, int sync,
const char *use)
{
PyTypeObject *type = (PyTypeObject *)Tkapp_Type;
TkappObject *v;
char *argv0;

v = PyObject_New(TkappObject, (PyTypeObject *) Tkapp_Type);
v = (TkappObject *)type->tp_alloc(type, 0);
if (v == NULL)
return NULL;

Expand Down Expand Up @@ -2745,9 +2746,10 @@ _tkinter_tktimertoken_deletetimerhandler_impl(TkttObject *self)
static TkttObject *
Tktt_New(PyObject *func)
{
PyTypeObject *type = (PyTypeObject *)Tktt_Type;
TkttObject *v;

v = PyObject_New(TkttObject, (PyTypeObject *) Tktt_Type);
v = (TkttObject *)type->tp_alloc(type, 0);
if (v == NULL)
return NULL;

Expand All @@ -2758,19 +2760,33 @@ Tktt_New(PyObject *func)
return (TkttObject*)Py_NewRef(v);
}

static void
Tktt_Dealloc(PyObject *self)
static int
Tktt_Clear(PyObject *op)
{
TkttObject *v = TkttObject_CAST(self);
PyObject *func = v->func;
PyObject *tp = (PyObject *) Py_TYPE(self);

Py_XDECREF(func);
TkttObject *self = TkttObject_CAST(op);
Py_CLEAR(self->func);
return 0;
}

PyObject_Free(self);
static void
Tktt_Dealloc(PyObject *op)
{
PyTypeObject *tp = Py_TYPE(op);
PyObject_GC_UnTrack(op);
(void)Tktt_Clear(op);
tp->tp_free(op);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality
Suggested change
tp->tp_free(op);
Py_TYPE(op)->tp_free(op);

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Unfortunately, this temporary variable is needed as we need Py_DECREF(Py_TYPE(op)) otherwise. The rest of the code base also does this.

Py_DECREF(tp);
}

static int
Tktt_Traverse(PyObject *op, visitproc visit, void *arg)
{
TkttObject *self = TkttObject_CAST(op);
Py_VISIT(Py_TYPE(op));
Py_VISIT(self->func);
return 0;
}

static PyObject *
Tktt_Repr(PyObject *self)
{
Expand Down Expand Up @@ -3061,21 +3077,38 @@ _tkinter_tkapp_willdispatch_impl(TkappObject *self)

/**** Tkapp Type Methods ****/

static int
Tkapp_Clear(PyObject *op)
{
TkappObject *self = TkappObject_CAST(op);
Py_CLEAR(self->trace);
return 0;
}

static void
Tkapp_Dealloc(PyObject *op)
{
PyTypeObject *tp = Py_TYPE(op);
PyObject_GC_UnTrack(op);
TkappObject *self = TkappObject_CAST(op);
PyTypeObject *tp = Py_TYPE(self);
/*CHECK_TCL_APPARTMENT;*/
ENTER_TCL
Tcl_DeleteInterp(Tkapp_Interp(self));
LEAVE_TCL
Py_XDECREF(self->trace);
PyObject_Free(self);
(void)Tkapp_Clear(op);
tp->tp_free(self);
Comment thread
picnixz marked this conversation as resolved.
Py_DECREF(tp);
DisableEventHook();
}

static int
Tkapp_Traverse(PyObject *op, visitproc visit, void *arg)
{
TkappObject *self = TkappObject_CAST(op);
Py_VISIT(Py_TYPE(op));
Py_VISIT(self->trace);
return 0;
}


/**** Tkinter Module ****/
Expand Down Expand Up @@ -3263,7 +3296,9 @@ static PyMethodDef Tktt_methods[] =
};

static PyType_Slot Tktt_Type_slots[] = {
{Py_tp_clear, Tktt_Clear},
{Py_tp_dealloc, Tktt_Dealloc},
{Py_tp_traverse, Tktt_Traverse},
{Py_tp_repr, Tktt_Repr},
{Py_tp_methods, Tktt_methods},
{0, 0}
Expand All @@ -3276,6 +3311,7 @@ static PyType_Spec Tktt_Type_spec = {
Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_DISALLOW_INSTANTIATION
| Py_TPFLAGS_IMMUTABLETYPE
| Py_TPFLAGS_HAVE_GC
),
.slots = Tktt_Type_slots,
};
Expand Down Expand Up @@ -3322,7 +3358,9 @@ static PyMethodDef Tkapp_methods[] =
};

static PyType_Slot Tkapp_Type_slots[] = {
{Py_tp_clear, Tkapp_Clear},
{Py_tp_dealloc, Tkapp_Dealloc},
{Py_tp_traverse, Tkapp_Traverse},
{Py_tp_methods, Tkapp_methods},
{0, 0}
};
Expand All @@ -3335,6 +3373,7 @@ static PyType_Spec Tkapp_Type_spec = {
Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_DISALLOW_INSTANTIATION
| Py_TPFLAGS_IMMUTABLETYPE
| Py_TPFLAGS_HAVE_GC
),
.slots = Tkapp_Type_slots,
};
Expand Down
Loading

Back | FazBrowse Home | New Git URL