Commit 584e8151 authored by Antoine Pitrou's avatar Antoine Pitrou

Fix refcounting issue with extension types in tkinter.

(issue #15721)
parent b723a12c
...@@ -24,6 +24,8 @@ Core and Builtins ...@@ -24,6 +24,8 @@ Core and Builtins
Library Library
------- -------
- Fix refcounting issue with extension types in tkinter.
- Issue #8112: xlmrpc.server's DocXMLRPCServer server no longer raises an error - Issue #8112: xlmrpc.server's DocXMLRPCServer server no longer raises an error
if methods have annotations; it now correctly displays the annotations. if methods have annotations; it now correctly displays the annotations.
......
...@@ -516,6 +516,7 @@ Tkapp_New(char *screenName, char *className, ...@@ -516,6 +516,7 @@ Tkapp_New(char *screenName, char *className,
v = PyObject_New(TkappObject, (PyTypeObject *) Tkapp_Type); v = PyObject_New(TkappObject, (PyTypeObject *) Tkapp_Type);
if (v == NULL) if (v == NULL)
return NULL; return NULL;
Py_INCREF(Tkapp_Type);
v->interp = Tcl_CreateInterp(); v->interp = Tcl_CreateInterp();
v->wantobjects = wantobjects; v->wantobjects = wantobjects;
...@@ -674,6 +675,7 @@ newPyTclObject(Tcl_Obj *arg) ...@@ -674,6 +675,7 @@ newPyTclObject(Tcl_Obj *arg)
self = PyObject_New(PyTclObject, (PyTypeObject *) PyTclObject_Type); self = PyObject_New(PyTclObject, (PyTypeObject *) PyTclObject_Type);
if (self == NULL) if (self == NULL)
return NULL; return NULL;
Py_INCREF(PyTclObject_Type);
Tcl_IncrRefCount(arg); Tcl_IncrRefCount(arg);
self->value = arg; self->value = arg;
self->string = NULL; self->string = NULL;
...@@ -683,9 +685,11 @@ newPyTclObject(Tcl_Obj *arg) ...@@ -683,9 +685,11 @@ newPyTclObject(Tcl_Obj *arg)
static void static void
PyTclObject_dealloc(PyTclObject *self) PyTclObject_dealloc(PyTclObject *self)
{ {
PyObject *tp = (PyObject *) Py_TYPE(self);
Tcl_DecrRefCount(self->value); Tcl_DecrRefCount(self->value);
Py_XDECREF(self->string); Py_XDECREF(self->string);
PyObject_Del(self); PyObject_Del(self);
Py_DECREF(tp);
} }
static char* static char*
...@@ -2196,6 +2200,7 @@ Tktt_New(PyObject *func) ...@@ -2196,6 +2200,7 @@ Tktt_New(PyObject *func)
v = PyObject_New(TkttObject, (PyTypeObject *) Tktt_Type); v = PyObject_New(TkttObject, (PyTypeObject *) Tktt_Type);
if (v == NULL) if (v == NULL)
return NULL; return NULL;
Py_INCREF(Tktt_Type);
Py_INCREF(func); Py_INCREF(func);
v->token = NULL; v->token = NULL;
...@@ -2211,10 +2216,12 @@ Tktt_Dealloc(PyObject *self) ...@@ -2211,10 +2216,12 @@ Tktt_Dealloc(PyObject *self)
{ {
TkttObject *v = (TkttObject *)self; TkttObject *v = (TkttObject *)self;
PyObject *func = v->func; PyObject *func = v->func;
PyObject *tp = (PyObject *) Py_TYPE(self);
Py_XDECREF(func); Py_XDECREF(func);
PyObject_Del(self); PyObject_Del(self);
Py_DECREF(tp);
} }
static PyObject * static PyObject *
...@@ -2520,11 +2527,13 @@ static PyMethodDef Tkapp_methods[] = ...@@ -2520,11 +2527,13 @@ static PyMethodDef Tkapp_methods[] =
static void static void
Tkapp_Dealloc(PyObject *self) Tkapp_Dealloc(PyObject *self)
{ {
PyObject *tp = (PyObject *) Py_TYPE(self);
/*CHECK_TCL_APPARTMENT;*/ /*CHECK_TCL_APPARTMENT;*/
ENTER_TCL ENTER_TCL
Tcl_DeleteInterp(Tkapp_Interp(self)); Tcl_DeleteInterp(Tkapp_Interp(self));
LEAVE_TCL LEAVE_TCL
PyObject_Del(self); PyObject_Del(self);
Py_DECREF(tp);
DisableEventHook(); DisableEventHook();
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment