| Ticket UUID: | fd8341e496916f627de178f551368ce9ca981252 | ||
| Title: | Tcl_InitStubs compatibility for 9.1 | ||
| Type: | Bug | Created on: | 2025-04-10 12:22:13 |
| Submitter: | jan.nijtmans | Assigned to: | jan.nijtmans |
| Subsystem: | 52. Portability Support | Severity: | Minor |
| Priority: | 5 Medium | Last modified: | 2025-04-11 17:04:46 |
| Status: | Closed | Closed by: | jan.nijtmans |
| Resolution: | Fixed | Closed on: | 2025-04-11 17:04:46 |
| Version: | 9.0 | ||
| 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] | ||||
