summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--generic/tkListbox.c56
-rw-r--r--tests/entry.test14
-rw-r--r--tests/listbox.test14
4 files changed, 51 insertions, 41 deletions
diff --git a/ChangeLog b/ChangeLog
index 210ef9b..ac7edea 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2006-05-29 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * tests/entry.test (entry-22.1):
+ * tests/listbox.test (listbox-6.15):
+ * generic/tkListbox.c (ListboxInsertSubCmd, ListboxDeleteSubCmd):
+ Ignore Tcl_SetVar2Ex failure of listVarName, similar to entry
+ widget handling. [Bug 1424513]
+
2006-05-26 Jeff Hobbs <jeffh@ActiveState.com>
* macosx/tkMacOSXButton.c (TkMacOSXDrawControl): correct redraw
diff --git a/generic/tkListbox.c b/generic/tkListbox.c
index 8856fa0..78cf3c9 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.34 2005/11/17 16:21:55 dkf Exp $
+ * RCS: @(#) $Id: tkListbox.c,v 1.35 2006/05/29 21:53:16 hobbs Exp $
*/
#include "tkPort.h"
@@ -2321,30 +2321,19 @@ ListboxInsertSubCmd(listPtr, index, objc, objv)
return result;
}
- Tcl_IncrRefCount(newListObj);
-
/*
- * Clean up the old reference.
+ * 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);
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,
- 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);
}
/*
@@ -2495,19 +2484,20 @@ ListboxDeleteSubCmd(listPtr, first, last)
return result;
}
- Tcl_IncrRefCount(newListObj);
-
/*
- * Clean up the old reference.
+ * 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);
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.
@@ -2516,18 +2506,6 @@ ListboxDeleteSubCmd(listPtr, first, last)
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,
- NULL, newListObj, TCL_GLOBAL_ONLY) == NULL) {
- Tcl_DecrRefCount(newListObj);
- return TCL_ERROR;
- }
- }
-
- /*
* Update the selection and viewing information to reflect the change in
* the element numbering, and redisplay to slide information up over the
* elements that were deleted.
diff --git a/tests/entry.test b/tests/entry.test
index 7732e8a..3d10e72 100644
--- a/tests/entry.test
+++ b/tests/entry.test
@@ -6,7 +6,7 @@
# Copyright (c) 1998-1999 by Scriptics Corporation.
# All rights reserved.
#
-# RCS: @(#) $Id: entry.test,v 1.19 2004/12/04 00:04:41 dkf Exp $
+# RCS: @(#) $Id: entry.test,v 1.20 2006/05/29 21:53:16 hobbs Exp $
package require tcltest 2.1
eval tcltest::configure $argv
@@ -1610,6 +1610,18 @@ test entry-21.1 {selection present while disabled, bug 637828} {
lappend out [.e selection present] [selection get]
} {1 1 345}
+test entry-22.1 {lost namespaced textvar} {
+ destroy .e
+ namespace eval test { variable foo {a b} }
+ entry .e -textvariable ::test::foo
+ namespace delete test
+ .e insert end "more stuff"
+ .e delete 5 end
+ catch {set ::test::foo} result
+ list [.e get] [.e cget -textvar] $result
+} [list "a bmo" ::test::foo \
+ {can't read "::test::foo": no such variable}]
+
destroy .e
# XXX Still need to write tests for EntryBlinkProc, EntryFocusProc,
diff --git a/tests/listbox.test b/tests/listbox.test
index 8534e10..a3d43ea 100644
--- a/tests/listbox.test
+++ b/tests/listbox.test
@@ -6,7 +6,7 @@
# Copyright (c) 1998-1999 by Scriptics Corporation.
# All rights reserved.
#
-# RCS: @(#) $Id: listbox.test,v 1.25 2004/12/08 03:03:06 dgp Exp $
+# RCS: @(#) $Id: listbox.test,v 1.26 2006/05/29 21:53:16 hobbs Exp $
package require tcltest 2.1
eval tcltest::configure $argv
@@ -1107,6 +1107,18 @@ test listbox-6.14 {InsertEls procedure, check selection update} {
.l2 insert 0 a
.l2 curselection
} [list 3 4 5]
+test listbox-6.15 {InsertEls procedure, lost namespaced listvar} {
+ destroy .l2
+ namespace eval test { variable foo {a b} }
+ listbox .l2 -listvar ::test::foo
+ namespace delete test
+ .l2 insert end c d
+ .l2 delete end
+ .l2 insert end e f
+ catch {set ::test::foo} result
+ list [.l2 get 0 end] [.l2 cget -listvar] $result
+} [list [list a b c e f] ::test::foo \
+ {can't read "::test::foo": no such variable}]
test listbox-7.1 {DeleteEls procedure} {