From 16a7d1751084a035aad9f3f46f8e5f764383487f Mon Sep 17 00:00:00 2001
From: jenglish <jenglish@noemail.net>
Date: Wed, 17 Feb 2010 20:57:02 +0000
Subject: generic/tkMenu.c: Defer TkMenuOptionTables cleanup to
 CallWhenDeleted() time, to ensure that the record doesn't get freed until
 after all widget instance commands have been deleted (Fixes [Bug#2952745]).

FossilOrigin-Name: 8326727e938ee232e0cdf2850478c8324f0cec10
---
 ChangeLog        | 7 +++++++
 generic/tkMenu.c | 9 +++++----
 2 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 37542f2..d3beba7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2010-02-17  Joe English  <jenglish@users.sourceforge.net>
+
+	* generic/tkMenu.c: Defer TkMenuOptionTables cleanup
+	to CallWhenDeleted() time, to ensure that the record
+	doesn't get freed until after all widget instance commands
+	have been deleted (Fixes [Bug#2952745]).
+
 2010-01-23  Pat Thoyts  <patthoyts@users.sourceforge.net>
 
 	* library/bgerror.tcl: [TIP #359]: Extended Window Manager Hints
diff --git a/generic/tkMenu.c b/generic/tkMenu.c
index b2bbf88..ecba7ba 100644
--- a/generic/tkMenu.c
+++ b/generic/tkMenu.c
@@ -12,7 +12,7 @@
  * See the file "license.terms" for information on usage and redistribution
  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  *
- * RCS: @(#) $Id: tkMenu.c,v 1.20.2.8 2009/02/06 08:14:29 das Exp $
+ * RCS: @(#) $Id: tkMenu.c,v 1.20.2.9 2010/02/17 20:57:03 jenglish Exp $
  */
 
 /*
@@ -402,7 +402,8 @@ static Tk_ClassProcs menuClass = {
 
 static void
 FreeOptionTables(
-    ClientData clientData)
+    ClientData clientData,
+    Tcl_Interp *interp)
 {
     ckfree(clientData);
 }
@@ -430,8 +431,8 @@ TkCreateMenuCmd(interp)
     optionTablesPtr->entryOptionTables[CHECK_BUTTON_ENTRY] =
 	    Tk_CreateOptionTable(interp, specsArray[CHECK_BUTTON_ENTRY]);
 
-    Tcl_CreateObjCommand(interp, "menu", MenuCmd,
-	    (ClientData) optionTablesPtr, FreeOptionTables);
+    Tcl_CreateObjCommand(interp, "menu", MenuCmd, optionTablesPtr, 0);
+    Tcl_CallWhenDeleted(interp, FreeOptionTables, optionTablesPtr);
 
     if (Tcl_IsSafe(interp)) {
 	Tcl_HideCommand(interp, "menu", "menu");
-- 
cgit v0.12