Tcl Source Code

View Ticket
Login
Ticket UUID: fd8341e496916f627de178f551368ce9ca981252
Title: Tcl_InitStubs compatibility for 9.1
Type: Bug Version: 9.0
Submitter: jan.nijtmans Created on: 2025-04-10 12:22:13
Subsystem: 52. Portability Support Assigned To: jan.nijtmans
Priority: 5 Medium Severity: Minor
Status: Closed Last Modified: 2025-04-11 17:04:46
Resolution: Fixed Closed By: jan.nijtmans
    Closed on: 2025-04-11 17:04:46
Description:

In order to work for all releases, Tk contains code like this:

    if (Tcl_InitStubs(interp, "8.x-", 0) == NULL) {
        if (Tcl_InitStubs(interp, "8.1", 0) == NULL) {
            abort();
        } else {
            Tcl_Panic("%s", Tcl_GetString(Tcl_GetObjResult(interp)));
        }
    }

The reason for this complication is because Tcl 8.x and 9.0 store the interp result in a different way: Tcl 8.x used the interp->result field, while Tcl 9.0 use interp->resultObj(). If the first Tcl_InitStubs() call fails, the stub-table is not initialized, so the Tcl_Panic() line won't work. The best we can do is abort. However, the second Tcl_InitStubs() call resets the interp result, so the Tcl_Panic() works but just gives an empty message.

What would be better is to rewrite the code like this:

    if (Tcl_InitStubs(interp, "8.x-", 0) == NULL) {
        Tcl_Panic("%s", Tcl_GetString(Tcl_GetObjResult(interp)));
    }
That won't work, because Tcl_InitStubs() doesn't initialize the stub table after a failure.

Proposed solution: When the version check fails, at least initialize tclStubsPtr for the public API. Then the Tcl_Panic() works.

Why no-one noticed that? Normally Tk and Tcl releases match, so no-one links a Tk version with a different Tcl version. That's the only situation this error goes off. I tested this by changing Tk 9.0 to check for "9.1".

User Comments: jan.nijtmans added on 2025-04-11 16:42:13:

Fixed [41c49572f8904ebf|here]