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] |
