| Ticket UUID: | ea39ab591e47448f448a85da8489864c17a1c23c | |||
| Title: | Tcl_StaticPackage allows case sensitvity; [load] prevents it | |||
| Type: | Bug | Version: | all | |
| Submitter: | dgp | Created on: | 2020-11-06 15:03:46 | |
| Subsystem: | 40. Dynamic Loading | Assigned To: | jan.nijtmans | |
| Priority: | 5 Medium | Severity: | Important | |
| Status: | Closed | Last Modified: | 2021-10-31 15:19:36 | |
| Resolution: | Fixed | Closed By: | jan.nijtmans | |
| Closed on: | 2021-10-31 15:19:36 | |||
| Description: |
This is the real issue touched on by the reforms proposed in TIP 590. The management of loaded module names has always been an inconsistent, incoherent mess. This is a bug, but one long-standing enough, and the change potentially disruptive enough that a TIP on the subject is sensible. Tcl_StaticPackage() allows for multiple modules to be registered that have names the differ only by case. The [load] command blocks that, and does lookups without respecting case. You cannot make sensible use of a system that is inconsistent with itself. | |||
| User Comments: |
jan.nijtmans added on 2021-10-31 15:19:36:
TIP #595 now accepted and implemented in Tcl 9.0. Closing jan.nijtmans added on 2020-11-09 16:16:53: Possible solution here: [7ec4c7e11a43340f]. This breaks any extension which assumes a case-insensitive "load" command, e.g. Itcl and sampleextension. I fixed Itcl and sampleextension on that now, but it's clear that this cannot be done until Tcl 9.0. And we need a good TIP and documentation and code-cleanup... So, far from finished yet, just consider this a small demo that it can be made to work. jan.nijtmans added on 2020-11-06 17:27:59: Hm it originally gave 25 test-failures. For completeness:
Running tests that match: *
Skipping test files that match: l.*.test
Only running test files that match: winDde.test
Tests began at Fri Nov 06 17:53:50 CET 2020
winDde.test
==== winDde-4.1 DDE execute remotely FAILED
==== Contents of test case:
set \xe1 ""
set name ch\xEDld-4.1
set child [createChildProcess $name]
dde execute TclEval $name [list set \xe1 foo]
dde execute TclEval $name {set done 1}
update
set \xe1
---- Test generated error; Return code was: 1
---- Return code should have been one of: 0 2
---- errorInfo: dde command failed
while executing
"dde execute TclEval $name [list set \xe1 foo]"
("uplevel" body line 5)
invoked from within
"uplevel 1 $script"
---- errorCode: TCL DDE FAILED
==== winDde-4.1 FAILED
==== winDde-4.2 DDE execute async remotely FAILED
==== Contents of test case:
set \xe1 ""
set name ch\xEDld-4.2
set child [createChildProcess $name]
dde execute -async TclEval $name [list set \xe1 foo]
update
dde execute TclEval $name {set done 1}
update
set \xe1
---- Test generated error; Return code was: 1
---- Return code should have been one of: 0 2
---- errorInfo: dde command failed
while executing
"dde execute -async TclEval $name [list set \xe1 foo]"
("uplevel" body line 5)
invoked from within
"uplevel 1 $script"
---- errorCode: TCL DDE FAILED
==== winDde-4.2 FAILED
==== winDde-4.3 DDE request remotely FAILED
==== Contents of test case:
set \xe1 ""
set name ch\xEDld-4.3
set child [createChildProcess $name]
dde execute TclEval $name [list set \xe1 foo]
set \xe1 [dde request TclEval $name \xe1]
dde execute TclEval $name {set done 1}
update
set \xe1
---- Test generated error; Return code was: 1
---- Return code should have been one of: 0 2
---- errorInfo: dde command failed
while executing
"dde execute TclEval $name [list set \xe1 foo]"
("uplevel" body line 5)
invoked from within
"uplevel 1 $script"
---- errorCode: TCL DDE FAILED
==== winDde-4.3 FAILED
==== winDde-4.4 DDE eval remotely FAILED
==== Contents of test case:
set \xe1 ""
set name ch\xEDld-4.4
set child [createChildProcess $name]
set \xe1 [dde eval $name set \xe1 foo]
dde execute TclEval $name {set done 1}
update
set \xe1
---- Test generated error; Return code was: 1
---- Return code should have been one of: 0 2
---- errorInfo: invalid data returned from server
while executing
"dde eval $name set \xe1 foo"
("uplevel" body line 5)
invoked from within
"uplevel 1 $script"
---- errorCode: TCL DDE BAD_RESPONSE
==== winDde-4.4 FAILED
==== winDde-6.5 DDE remote servername collision FAILED
==== Contents of test case:
dde servername -- $name
---- Result was:
chíld-6.5
---- Result should have been (exact matching):
chíld-6.5 #2
==== winDde-6.5 FAILED
==== winDde-7.1 Load DDE in child interpreter FAILED
==== Contents of test case:
child eval [list load $::ddelib Dde]
child eval [list dde servername -- dde-interp-7.1]
---- Test generated error; Return code was: 1
---- Return code should have been one of: 0 2
---- errorInfo: couldn't load library "C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib": Bad exe format. Possibly a 32/64-bit mismatch.
while executing
"load C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib Dde"
invoked from within
"child eval [list load $::ddelib Dde]"
("uplevel" body line 2)
invoked from within
"uplevel 1 $script"
---- errorCode: WIN_LOAD BAD_EXE_FORMAT
==== winDde-7.1 FAILED
==== winDde-7.2 DDE child cleanup FAILED
==== Contents of test case:
dde services TclEval {}
set s [dde services TclEval {}]
set m [list [list TclEval dde-interp-7.5]]
if {$m in $s} {
set s
}
---- Test setup failed:
couldn't load library "C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib": Bad exe format. Possibly a 32/64-bit mismatch.
---- errorInfo(setup): couldn't load library "C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib": Bad exe format. Possibly a 32/64-bit mismatch.
while executing
"load C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib Dde"
invoked from within
"child eval [list load $::ddelib Dde]"
("uplevel" body line 3)
invoked from within
"uplevel 1 $setup"
---- errorCode(setup): WIN_LOAD BAD_EXE_FORMAT
==== winDde-7.2 FAILED
==== winDde-7.3 DDE present in child interp FAILED
==== Contents of test case:
dde services TclEval dde-interp-7.3
---- Test setup failed:
interpreter named "child" already exists, cannot create
---- errorInfo(setup): interpreter named "child" already exists, cannot create
while executing
"interp create child"
("uplevel" body line 2)
invoked from within
"uplevel 1 $setup"
---- errorCode(setup): NONE
==== winDde-7.3 FAILED
==== winDde-7.4 interp name collision with -force FAILED
==== Contents of test case:
dde servername -force -- dde-interp-7.4
---- Test setup failed:
couldn't load library "C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib": Bad exe format. Possibly a 32/64-bit mismatch.
---- errorInfo(setup): couldn't load library "C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib": Bad exe format. Possibly a 32/64-bit mismatch.
while executing
"load C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib Dde"
invoked from within
"child eval [list load $::ddelib Dde]"
("uplevel" body line 3)
invoked from within
"uplevel 1 $setup"
---- errorCode(setup): WIN_LOAD BAD_EXE_FORMAT
==== winDde-7.4 FAILED
==== winDde-7.5 interp name collision without -force FAILED
==== Contents of test case:
dde servername -- dde-interp-7.5
---- Test setup failed:
couldn't load library "C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib": Bad exe format. Possibly a 32/64-bit mismatch.
---- errorInfo(setup): couldn't load library "C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib": Bad exe format. Possibly a 32/64-bit mismatch.
while executing
"load C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib Dde"
invoked from within
"child eval [list load $::ddelib Dde]"
("uplevel" body line 3)
invoked from within
"uplevel 1 $setup"
---- errorCode(setup): WIN_LOAD BAD_EXE_FORMAT
==== winDde-7.5 FAILED
==== winDde-8.1 Safe DDE load FAILED
==== Contents of test case:
child eval dde servername child
---- Test setup failed:
couldn't load library "C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib": Bad exe format. Possibly a 32/64-bit mismatch.
---- errorInfo(setup): couldn't load library "C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib": Bad exe format. Possibly a 32/64-bit mismatch.
while executing
"load C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib Dde"
invoked from within
"child invokehidden load $::ddelib Dde"
("uplevel" body line 3)
invoked from within
"uplevel 1 $setup"
---- errorCode(setup): WIN_LOAD BAD_EXE_FORMAT
==== winDde-8.1 FAILED
==== winDde-8.2 Safe DDE set servername FAILED
==== Contents of test case:
child invokehidden dde servername child
---- Test setup failed:
couldn't load library "C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib": Bad exe format. Possibly a 32/64-bit mismatch.
---- errorInfo(setup): couldn't load library "C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib": Bad exe format. Possibly a 32/64-bit mismatch.
while executing
"load C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib Dde"
invoked from within
"child invokehidden load $::ddelib Dde"
("uplevel" body line 3)
invoked from within
"uplevel 1 $setup"
---- errorCode(setup): WIN_LOAD BAD_EXE_FORMAT
==== winDde-8.2 FAILED
==== winDde-8.3 Safe DDE check handler required for eval FAILED
==== Contents of test case:
catch {dde eval child set a 1} msg
---- Test setup failed:
couldn't load library "C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib": Bad exe format. Possibly a 32/64-bit mismatch.
---- errorInfo(setup): couldn't load library "C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib": Bad exe format. Possibly a 32/64-bit mismatch.
while executing
"load C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib Dde"
invoked from within
"child invokehidden load $::ddelib Dde"
("uplevel" body line 3)
invoked from within
"uplevel 1 $setup"
---- errorCode(setup): WIN_LOAD BAD_EXE_FORMAT
==== winDde-8.3 FAILED
==== winDde-8.4 Safe DDE check that execute is denied FAILED
==== Contents of test case:
child eval set a 1
dde execute TclEval child {set a 2}
child eval set a
---- Test setup failed:
couldn't load library "C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib": Bad exe format. Possibly a 32/64-bit mismatch.
---- errorInfo(setup): couldn't load library "C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib": Bad exe format. Possibly a 32/64-bit mismatch.
while executing
"load C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib Dde"
invoked from within
"child invokehidden load $::ddelib Dde"
("uplevel" body line 3)
invoked from within
"uplevel 1 $setup"
---- errorCode(setup): WIN_LOAD BAD_EXE_FORMAT
==== winDde-8.4 FAILED
==== winDde-8.5 Safe DDE check that request is denied FAILED
==== Contents of test case:
child eval set a 1
dde request TclEval child a
---- Test setup failed:
couldn't load library "C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib": Bad exe format. Possibly a 32/64-bit mismatch.
---- errorInfo(setup): couldn't load library "C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib": Bad exe format. Possibly a 32/64-bit mismatch.
while executing
"load C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib Dde"
invoked from within
"child invokehidden load $::ddelib Dde"
("uplevel" body line 3)
invoked from within
"uplevel 1 $setup"
---- errorCode(setup): WIN_LOAD BAD_EXE_FORMAT
==== winDde-8.5 FAILED
==== winDde-8.6 Safe DDE assign handler procedure FAILED
==== Contents of test case:
child invokehidden dde servername -handler DDEACCEPT child
---- Test setup failed:
couldn't load library "C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib": Bad exe format. Possibly a 32/64-bit mismatch.
---- errorInfo(setup): couldn't load library "C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib": Bad exe format. Possibly a 32/64-bit mismatch.
while executing
"load C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib Dde"
invoked from within
"child invokehidden load $::ddelib Dde"
("uplevel" body line 3)
invoked from within
"uplevel 1 $setup"
---- errorCode(setup): WIN_LOAD BAD_EXE_FORMAT
==== winDde-8.6 FAILED
==== winDde-8.7 Safe DDE check simple command FAILED
==== Contents of test case:
dde eval child set x 1
---- Test setup failed:
couldn't load library "C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib": Bad exe format. Possibly a 32/64-bit mismatch.
---- errorInfo(setup): couldn't load library "C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib": Bad exe format. Possibly a 32/64-bit mismatch.
while executing
"load C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib Dde"
invoked from within
"child invokehidden load $::ddelib Dde"
("uplevel" body line 3)
invoked from within
"uplevel 1 $setup"
---- errorCode(setup): WIN_LOAD BAD_EXE_FORMAT
==== winDde-8.7 FAILED
==== winDde-8.8 Safe DDE check non-list command FAILED
==== Contents of test case:
set s "c:\\Program Files\\Microsoft Visual Studio\\"
dde eval child $s
string equal [child eval set DDECMD] $s
---- Test setup failed:
couldn't load library "C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib": Bad exe format. Possibly a 32/64-bit mismatch.
---- errorInfo(setup): couldn't load library "C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib": Bad exe format. Possibly a 32/64-bit mismatch.
while executing
"load C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib Dde"
invoked from within
"child invokehidden load $::ddelib Dde"
("uplevel" body line 3)
invoked from within
"uplevel 1 $setup"
---- errorCode(setup): WIN_LOAD BAD_EXE_FORMAT
==== winDde-8.8 FAILED
==== winDde-8.9 Safe DDE check command evaluation FAILED
==== Contents of test case:
dde eval child set \xe1 1
child eval set \xe1
---- Test setup failed:
couldn't load library "C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib": Bad exe format. Possibly a 32/64-bit mismatch.
---- errorInfo(setup): couldn't load library "C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib": Bad exe format. Possibly a 32/64-bit mismatch.
while executing
"load C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib Dde"
invoked from within
"child invokehidden load $::ddelib Dde"
("uplevel" body line 3)
invoked from within
"uplevel 1 $setup"
---- errorCode(setup): WIN_LOAD BAD_EXE_FORMAT
==== winDde-8.9 FAILED
==== winDde-8.10 Safe DDE check command evaluation (2) FAILED
==== Contents of test case:
dde eval child [list set x 1]
child eval set x
---- Test setup failed:
couldn't load library "C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib": Bad exe format. Possibly a 32/64-bit mismatch.
---- errorInfo(setup): couldn't load library "C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib": Bad exe format. Possibly a 32/64-bit mismatch.
while executing
"load C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib Dde"
invoked from within
"child invokehidden load $::ddelib Dde"
("uplevel" body line 3)
invoked from within
"uplevel 1 $setup"
---- errorCode(setup): WIN_LOAD BAD_EXE_FORMAT
==== winDde-8.10 FAILED
==== winDde-8.11 Safe DDE check command evaluation (3) FAILED
==== Contents of test case:
dde eval child [list [list set x 1]]
child eval set x
---- Test setup failed:
couldn't load library "C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib": Bad exe format. Possibly a 32/64-bit mismatch.
---- errorInfo(setup): couldn't load library "C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib": Bad exe format. Possibly a 32/64-bit mismatch.
while executing
"load C:/Users/jan.nijtmans/workspace/tcl8.7/win/Release_AMD64_VC1923/tcldde14s.lib Dde"
invoked from within
"child invokehidden load $::ddelib Dde"
("uplevel" body line 3)
invoked from within
"uplevel 1 $setup"
---- errorCode(setup): WIN_LOAD BAD_EXE_FORMAT
==== winDde-8.11 FAILED
==== winDde-9.1 External safe DDE check string passing FAILED
==== Contents of test case:
dde eval $name set x 1
gets $child line
set line
---- Test generated error; Return code was: 1
---- Return code should have been one of: 0 2
---- errorInfo: invalid data returned from server
while executing
"dde eval $name set x 1"
("uplevel" body line 2)
invoked from within
"uplevel 1 $script"
---- errorCode: TCL DDE BAD_RESPONSE
---- Test cleanup failed:
dde command failed
---- errorInfo(cleanup): dde command failed
while executing
"dde execute TclEval $name stop"
("uplevel" body line 2)
invoked from within
"uplevel 1 $cleanup"
---- errorCode(cleanup): TCL DDE FAILED
==== winDde-9.1 FAILED
==== winDde-9.2 External safe DDE check command evaluation FAILED
==== Contents of test case:
dde eval $name set x 1
gets $child line
set line
---- Test generated error; Return code was: 1
---- Return code should have been one of: 0 2
---- errorInfo: invalid data returned from server
while executing
"dde eval $name set x 1"
("uplevel" body line 2)
invoked from within
"uplevel 1 $script"
---- errorCode: TCL DDE BAD_RESPONSE
---- Test cleanup failed:
dde command failed
---- errorInfo(cleanup): dde command failed
while executing
"dde execute TclEval $name stop"
("uplevel" body line 2)
invoked from within
"uplevel 1 $cleanup"
---- errorCode(cleanup): TCL DDE FAILED
==== winDde-9.2 FAILED
==== winDde-9.3 External safe DDE check prefixed arguments FAILED
==== Contents of test case:
dde eval $name set x 1
gets $child line
set line
---- Test generated error; Return code was: 1
---- Return code should have been one of: 0 2
---- errorInfo: invalid data returned from server
while executing
"dde eval $name set x 1"
("uplevel" body line 2)
invoked from within
"uplevel 1 $script"
---- errorCode: TCL DDE BAD_RESPONSE
---- Test cleanup failed:
dde command failed
---- errorInfo(cleanup): dde command failed
while executing
"dde execute TclEval $name stop"
("uplevel" body line 2)
invoked from within
"uplevel 1 $cleanup"
---- errorCode(cleanup): TCL DDE FAILED
==== winDde-9.3 FAILED
==== winDde-9.4 External safe DDE check null data passing FAILED
==== Contents of test case:
dde execute TclEval $name ""
gets $child line
set line
---- Test generated error; Return code was: 1
---- Return code should have been one of: 0 2
---- errorInfo: dde command failed
while executing
"dde execute TclEval $name """
("uplevel" body line 2)
invoked from within
"uplevel 1 $script"
---- errorCode: TCL DDE FAILED
---- Test cleanup failed:
dde command failed
---- errorInfo(cleanup): dde command failed
while executing
"dde execute TclEval $name stop"
("uplevel" body line 2)
invoked from within
"uplevel 1 $cleanup"
---- errorCode(cleanup): TCL DDE FAILED
==== winDde-9.4 FAILED
Tests ended at Fri Nov 06 17:53:51 CET 2020
all.tcl: Total 50 Passed 22 Skipped 3 Failed 25
Sourced 1 Test Files.
Files with failing tests: winDde.test
Number of tests skipped for each constraint:
3 debug
jan.nijtmans added on 2020-11-06 17:26:23: > If we have a build configuration never used by anyone, let's please eliminate it. Or fix it, what I did now. The only way to build a "staticpackage" build is using makefile.vc, the win/configure script doesn't have an enable-staticpkg or something like that. So I made a "nmake -f makefile.vc OPTS=static,staticpkg" build and added it to Travis. It gave 2 test failures, due to Tcl_StaticPackage called with a lowercase package name: such libraries can never be "loaded" in in an interpreter. I turned out that winDde.test contained another error: It didn't account for ::ddelib to be {}, which is the case with statically loaded dde package. That's corrected now. Maybe we don't use such a configuration, I'm sure that tclkit builds use it! Anyway, it should be fixed now. dgp added on 2020-11-06 16:47:13: If we have a build configuration never used by anyone, let's please eliminate it. jan.nijtmans added on 2020-11-06 16:24:58: Exactly this is the reason for commit [d8e520bee8]: If Tcl_StaticPackage() is called with a non-camel-cased package name, it can later never be found by the "load" command. No-one ever builds a tclsh with TCL_USE_STATIC_PACKAGES on Windows, that's why no-one discovered this yet. I'm sure that testcases fail in such a Windows build, but I'll check this. | |||