summaryrefslogtreecommitdiffstats
path: root/generic/tkListbox.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tkListbox.c')
-rw-r--r--generic/tkListbox.c46
1 files changed, 22 insertions, 24 deletions
diff --git a/generic/tkListbox.c b/generic/tkListbox.c
index fd02a27..43342c4 100644
--- a/generic/tkListbox.c
+++ b/generic/tkListbox.c
@@ -11,7 +11,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkListbox.c,v 1.29.2.2 2004/06/08 20:11:18 dgp Exp $
+ * RCS: @(#) $Id: tkListbox.c,v 1.29.2.3 2006/05/29 21:52:47 hobbs Exp $
*/
#include "tkPort.h"
@@ -2284,25 +2284,24 @@ ListboxInsertSubCmd(listPtr, index, objc, objv)
return result;
}
+ /*
+ * Replace the current object and set attached listvar, if any.
+ * This may error if listvar points to a var in a deleted namespace, but
+ * we ignore those errors. If the namespace is recreated, it will
+ * auto-sync with the current value. [Bug 1424513]
+ */
+
Tcl_IncrRefCount(newListObj);
- /* Clean up the old reference */
Tcl_DecrRefCount(listPtr->listObj);
-
- /* Set the internal pointer to the new obj */
listPtr->listObj = newListObj;
-
- /* If there is a listvar, make sure it points at the new object */
if (listPtr->listVarName != NULL) {
- if (Tcl_SetVar2Ex(listPtr->interp, listPtr->listVarName,
- (char *)NULL, newListObj, TCL_GLOBAL_ONLY) == NULL) {
- Tcl_DecrRefCount(newListObj);
- return TCL_ERROR;
- }
+ Tcl_SetVar2Ex(listPtr->interp, listPtr->listVarName,
+ (char *) NULL, listPtr->listObj, TCL_GLOBAL_ONLY);
}
/* Get the new list length */
Tcl_ListObjLength(listPtr->interp, listPtr->listObj, &listPtr->nElements);
-
+
/*
* Update the "special" indices (anchor, topIndex, active) to account
* for the renumbering that just occurred. Then arrange for the new
@@ -2433,24 +2432,23 @@ ListboxDeleteSubCmd(listPtr, first, last)
return result;
}
+ /*
+ * Replace the current object and set attached listvar, if any.
+ * This may error if listvar points to a var in a deleted namespace, but
+ * we ignore those errors. If the namespace is recreated, it will
+ * auto-sync with the current value. [Bug 1424513]
+ */
+
Tcl_IncrRefCount(newListObj);
- /* Clean up the old reference */
Tcl_DecrRefCount(listPtr->listObj);
-
- /* Set the internal pointer to the new obj */
listPtr->listObj = newListObj;
+ if (listPtr->listVarName != NULL) {
+ Tcl_SetVar2Ex(listPtr->interp, listPtr->listVarName,
+ (char *) NULL, listPtr->listObj, TCL_GLOBAL_ONLY);
+ }
/* Get the new list length */
Tcl_ListObjLength(listPtr->interp, listPtr->listObj, &listPtr->nElements);
-
- /* If there is a listvar, make sure it points at the new object */
- if (listPtr->listVarName != NULL) {
- if (Tcl_SetVar2Ex(listPtr->interp, listPtr->listVarName,
- (char *)NULL, newListObj, TCL_GLOBAL_ONLY) == NULL) {
- Tcl_DecrRefCount(newListObj);
- return TCL_ERROR;
- }
- }
/*
* Update the selection and viewing information to reflect the change