]> granicus.if.org Git - python/commitdiff
Fix refcounting issue with extension types in tkinter.
authorAntoine Pitrou <solipsis@pitrou.net>
Sat, 10 Aug 2013 22:22:30 +0000 (00:22 +0200)
committerAntoine Pitrou <solipsis@pitrou.net>
Sat, 10 Aug 2013 22:22:30 +0000 (00:22 +0200)
(issue #15721)

Misc/NEWS
Modules/_tkinter.c

index 5c734798f7ca84f0ed6498b3a2425a1c60b715dc..1bbb17e29fbb02561ae992620d8689bad68a73e1 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -24,6 +24,8 @@ Core and Builtins
 Library
 -------
 
+- Fix refcounting issue with extension types in tkinter.
+
 - Issue #8112: xlmrpc.server's DocXMLRPCServer server no longer raises an error
   if methods have annotations; it now correctly displays the annotations.
 
index 26f10fd397779cf3f9cfba2378fb0aa15a450539..637a9bb205d254fa30e12f637e611472af03012b 100644 (file)
@@ -516,6 +516,7 @@ Tkapp_New(char *screenName, char *className,
     v = PyObject_New(TkappObject, (PyTypeObject *) Tkapp_Type);
     if (v == NULL)
         return NULL;
+    Py_INCREF(Tkapp_Type);
 
     v->interp = Tcl_CreateInterp();
     v->wantobjects = wantobjects;
@@ -674,6 +675,7 @@ newPyTclObject(Tcl_Obj *arg)
     self = PyObject_New(PyTclObject, (PyTypeObject *) PyTclObject_Type);
     if (self == NULL)
         return NULL;
+    Py_INCREF(PyTclObject_Type);
     Tcl_IncrRefCount(arg);
     self->value = arg;
     self->string = NULL;
@@ -683,9 +685,11 @@ newPyTclObject(Tcl_Obj *arg)
 static void
 PyTclObject_dealloc(PyTclObject *self)
 {
+    PyObject *tp = (PyObject *) Py_TYPE(self);
     Tcl_DecrRefCount(self->value);
     Py_XDECREF(self->string);
     PyObject_Del(self);
+    Py_DECREF(tp);
 }
 
 static char*
@@ -2196,6 +2200,7 @@ Tktt_New(PyObject *func)
     v = PyObject_New(TkttObject, (PyTypeObject *) Tktt_Type);
     if (v == NULL)
         return NULL;
+    Py_INCREF(Tktt_Type);
 
     Py_INCREF(func);
     v->token = NULL;
@@ -2211,10 +2216,12 @@ Tktt_Dealloc(PyObject *self)
 {
     TkttObject *v = (TkttObject *)self;
     PyObject *func = v->func;
+    PyObject *tp = (PyObject *) Py_TYPE(self);
 
     Py_XDECREF(func);
 
     PyObject_Del(self);
+    Py_DECREF(tp);
 }
 
 static PyObject *
@@ -2520,11 +2527,13 @@ static PyMethodDef Tkapp_methods[] =
 static void
 Tkapp_Dealloc(PyObject *self)
 {
+    PyObject *tp = (PyObject *) Py_TYPE(self);
     /*CHECK_TCL_APPARTMENT;*/
     ENTER_TCL
     Tcl_DeleteInterp(Tkapp_Interp(self));
     LEAVE_TCL
     PyObject_Del(self);
+    Py_DECREF(tp);
     DisableEventHook();
 }