Itk - the [incr Tk] extension

View Ticket
Login
Bounty program for improvements to Tcl and certain Tcl packages.
Tcl 2019 Conference, Houston/TX, US, Nov 4-8
Send your abstracts to [email protected]
or submit via the online form by Sep 9.
Ticket UUID: 6cb97a121190134fb252351a6429a743046948d8
Title: infinite loop in iwidgets Panedwindow-2.5
Status: Closed Type: Code_Defect
Severity: Critical Priority: Immediate
Subsystem: Resolution: Fixed
Last Modified: 2017-07-28 16:44:39
Version Found In: 4.1.0
User Comments:
dgp added on 2017-07-11 19:24:19:
With the Iwidgets test suite:

$ make test TESTFLAGS='-file panedwindow.test -match "Panedwindow-1.1 Panedwindow-2.5"'
...
==== Panedwindow-2.5 configuration options, -orient FAILED
==== Contents of test case:

            .pw configure $option [lindex $test 1]
            lindex [.pw configure $option] 4

---- Test generated error; Return code was: 1
---- Return code should have been one of: 0 2
---- errorInfo: too many nested evaluations (infinite loop?)
    while executing
"destroy .pw.sash1"
    ("uplevel" body line 1)
    invoked from within
"uplevel #0 destroy .pw.sash1"
    invoked from within
...
"destroy .pw.sash1"
    ("uplevel" body line 1)
    invoked from within
"uplevel #0 destroy .pw.sash1"
    invoked from within
"destroy $itk_component($sash)"
    (object "::.pw" method "::iwidgets::Panedwindow::_makeSashes" body line 12)
    invoked from within
"_makeSashes"
    (while configuring option "-orient" for widget "::.pw")
    invoked from within
".pw configure $option [lindex $test 1]"
    ("uplevel" body line 2)
    invoked from within
"uplevel 1 $script"
---- errorCode: TCL LIMIT STACK
==== Panedwindow-2.5 FAILED

dgp added on 2017-07-11 19:28:50:
The cause of the problem is that

uplevel #0 destroy $widget

is (properly) expecting that the namespace
of level #0 is the global namespace so that
"destroy" resolves to the Tk command "::destroy".

What is happening instead is that Itk has done
some shenanigans under the covers to force the
namespace of that frame to be ::iwidgets::Panedwindow
so that some resolutions in the config script
happen as they need to.

This is clearly an incorrect solution, and another
one has to be found, probably involving the pushing
and popping of a callframe.

dgp added on 2017-07-28 16:44:39:
Fixed in release 4.1.0