diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | generic/tkListbox.c | 56 | ||||
-rw-r--r-- | tests/entry.test | 14 | ||||
-rw-r--r-- | tests/listbox.test | 14 |
4 files changed, 51 insertions, 41 deletions
@@ -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} { |