Check-in [791adf31da]
Not logged in

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Merge 8.6
Timelines: family | ancestors | descendants | both | core-9-0-branch
Files: files | file ages | folders
SHA3-256: 791adf31dac52c79f077578e762a3ccac3b4d0d1801f1cc034a805008c113e72
User & Date: jan.nijtmans 2025-09-15 20:08:00.098
Context
2025-09-15
20:59
Unicode version 17 check-in: c658915b9b user: jan.nijtmans tags: core-9-0-branch
20:16
(more) Use correct equality check-in: c9bb1a7642 user: jan.nijtmans tags: trunk, main
20:08
Merge 8.6 check-in: 791adf31da user: jan.nijtmans tags: core-9-0-branch
19:43
(backport) Use correct equality check-in: d637d83a33 user: jan.nijtmans tags: core-8-6-branch
2025-09-12
08:04
deprecate (internal) NS_KILLED. It is not used any more check-in: a3f7a54f52 user: jan.nijtmans tags: core-9-0-branch
Changes
Unified Diff Ignore Whitespace Patch
Changes to changes.md.
12
13
14
15
16
17
18

19
20
21
22
23
24
25
# Bug fixes
 - [On Unix, IsTimeNative() always defined but not always used](https://core.tcl-lang.org/tcl/tktview/6b8e39)
 - [Tweak install permissions](https://core.tcl-lang.org/tcl/tktview/31d4fa)
 - [interp creation resets encoding directory search path](https://core.tcl-lang.org/tcl/tktview/87b697)
 - [Pointer arithmetic with NULL in buildInfoObjCmd()](https://core.tcl-lang.org/tcl/tktview/85fc8b)

# Updated bundled packages, libraries, standards, data

 - platform 1.1.0
 - sqlite3 3.50.4
 - tcltest 2.5.10
 - Thread 3.0.3
 - TDBC\* 1.1.12

Release Tcl 9.0.2 arises from the check-in with tag `core-9-0-2`.







>







12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# Bug fixes
 - [On Unix, IsTimeNative() always defined but not always used](https://core.tcl-lang.org/tcl/tktview/6b8e39)
 - [Tweak install permissions](https://core.tcl-lang.org/tcl/tktview/31d4fa)
 - [interp creation resets encoding directory search path](https://core.tcl-lang.org/tcl/tktview/87b697)
 - [Pointer arithmetic with NULL in buildInfoObjCmd()](https://core.tcl-lang.org/tcl/tktview/85fc8b)

# Updated bundled packages, libraries, standards, data
 - http 2.10.1
 - platform 1.1.0
 - sqlite3 3.50.4
 - tcltest 2.5.10
 - Thread 3.0.3
 - TDBC\* 1.1.12

Release Tcl 9.0.2 arises from the check-in with tag `core-9-0-2`.
Changes to library/http/http.tcl.
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
		Finish $token $nhl
		return
	    } elseif {$nhl == 0} {
		##Log header done - token $token
		Log ^E$tk end of response headers - token $token
		# We have now read all headers
		# We ignore HTTP/1.1 100 Continue returns. RFC2616 sec 8.2.3
		if {    ($state(http) == "")
		     || ([regexp {^\S+\s(\d+)} $state(http) {} x] && $x == 100)
		} {
		    set state(state) "connecting"
		    continue
		    # This was a "return" in the pre-coroutine code.
		}








|







3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
		Finish $token $nhl
		return
	    } elseif {$nhl == 0} {
		##Log header done - token $token
		Log ^E$tk end of response headers - token $token
		# We have now read all headers
		# We ignore HTTP/1.1 100 Continue returns. RFC2616 sec 8.2.3
		if {    ($state(http) eq "")
		     || ([regexp {^\S+\s(\d+)} $state(http) {} x] && $x == 100)
		} {
		    set state(state) "connecting"
		    continue
		    # This was a "return" in the pre-coroutine code.
		}

Changes to library/platform/platform.tcl.
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
		append cpu _32
	    }
	}
    }

    switch -glob -- $plat {
	windows {
	    if {$tcl_platform(platform) == "unix"} {
		set plat cygwin
	    } else {
		set plat win32
	    }
	    if {$cpu eq "amd64"} {
		# Do not check wordSize, win32-x64 is an IL32P64 platform.
		set cpu x86_64







|







95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
		append cpu _32
	    }
	}
    }

    switch -glob -- $plat {
	windows {
	    if {$tcl_platform(platform) eq "unix"} {
		set plat cygwin
	    } else {
		set plat win32
	    }
	    if {$cpu eq "amd64"} {
		# Do not check wordSize, win32-x64 is an IL32P64 platform.
		set cpu x86_64
Changes to tests/chanio.test.
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
\#123456789abcdef01
\#"
    }
    chan close $f

    set path(cat) [makeFile {
	set f stdin
	if {$argv != ""} {
	    set f [open [lindex $argv 0]]
	}
	chan configure $f -translation binary -blocking 0 -eofchar \x1A
	chan configure stdout -translation binary -buffering none
	chan event $f readable "foo $f"
	proc foo {f} {
	    set x [chan read $f]







|







80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
\#123456789abcdef01
\#"
    }
    chan close $f

    set path(cat) [makeFile {
	set f stdin
	if {$argv ne ""} {
	    set f [open [lindex $argv 0]]
	}
	chan configure $f -translation binary -blocking 0 -eofchar \x1A
	chan configure stdout -translation binary -buffering none
	chan event $f readable "foo $f"
	proc foo {f} {
	    set x [chan read $f]
Changes to tests/interp.test.
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
    lappend res [namespace eval tst a]
    rename p {}
    rename a {}
    namespace delete tst
    set res
 } {GLOBAL GLOBAL}

if {[info command nonexistent-command-in-parent] != ""} {
    rename nonexistent-command-in-parent {}
}

# Part 9: Aliasing between interpreters
test interp-10.1 {testing aliasing between interpreters} {
    catch {interp delete a}
    catch {interp delete b}







|







331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
    lappend res [namespace eval tst a]
    rename p {}
    rename a {}
    namespace delete tst
    set res
 } {GLOBAL GLOBAL}

if {[info command nonexistent-command-in-parent] ne ""} {
    rename nonexistent-command-in-parent {}
}

# Part 9: Aliasing between interpreters
test interp-10.1 {testing aliasing between interpreters} {
    catch {interp delete a}
    catch {interp delete b}
Changes to tests/io.test.
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
\#123456789abcdef01
\#"
    }
close $f

set path(cat) [makeFile {
    set f stdin
    if {$argv != ""} {
	set f [open [lindex $argv 0]]
    }
    fconfigure $f -translation binary -blocking 0 -eofchar \x1A
    fconfigure stdout -translation binary -buffering none
    fileevent $f readable "foo $f"
    proc foo {f} {
	set x [read $f]







|







74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
\#123456789abcdef01
\#"
    }
close $f

set path(cat) [makeFile {
    set f stdin
    if {$argv ne ""} {
	set f [open [lindex $argv 0]]
    }
    fconfigure $f -translation binary -blocking 0 -eofchar \x1A
    fconfigure stdout -translation binary -buffering none
    fileevent $f readable "foo $f"
    proc foo {f} {
	set x [read $f]
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
    close $fd
} -result {xxxxxxx 1 {POSIX EILSEQ {invalid or incomplete multibyte or wide character}}}

# Test standard handle management. The functions tested are
# Tcl_SetStdChannel and Tcl_GetStdChannel. Incidentally we are
# also testing channel table management.

if {[info commands testchannel] != ""} {
    set consoleFileNames [lsort [testchannel open]]
} else {
    # just to avoid an error
    set consoleFileNames [list]
}

test io-14.1 {Tcl_SetStdChannel and Tcl_GetStdChannel} {testchannel} {







|







1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
    close $fd
} -result {xxxxxxx 1 {POSIX EILSEQ {invalid or incomplete multibyte or wide character}}}

# Test standard handle management. The functions tested are
# Tcl_SetStdChannel and Tcl_GetStdChannel. Incidentally we are
# also testing channel table management.

if {[info commands testchannel] ne ""} {
    set consoleFileNames [lsort [testchannel open]]
} else {
    # just to avoid an error
    set consoleFileNames [list]
}

test io-14.1 {Tcl_SetStdChannel and Tcl_GetStdChannel} {testchannel} {
8763
8764
8765
8766
8767
8768
8769
8770
8771
8772
8773
8774
8775
8776
8777
    }
    proc doit {s} {
	variable counter
	variable after

	incr counter
	set l [gets $s]
	if {"$l" == ""} {
	    fileevent $s readable [namespace code "doit1 $s"]
	    set after [after 1000 [namespace code newline]]
	}
    }
    proc doit1 {s} {
	variable counter
	variable accept







|







8763
8764
8765
8766
8767
8768
8769
8770
8771
8772
8773
8774
8775
8776
8777
    }
    proc doit {s} {
	variable counter
	variable after

	incr counter
	set l [gets $s]
	if {"$l" eq ""} {
	    fileevent $s readable [namespace code "doit1 $s"]
	    set after [after 1000 [namespace code newline]]
	}
    }
    proc doit1 {s} {
	variable counter
	variable accept
Changes to tests/socket.test.
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
    } -result {transport endpoint is not connected} -returnCodes 1
test socket-14.12 {[socket -async] background progress triggered by [fconfigure -error]} \
    -constraints {socket} \
    -body {
	set s [socket -async localhost [randport]]
	for {set i 0} {$i < 50} {incr i} {
	    set x [fconfigure $s -error]
	    if {$x != ""} break
	    after 200
	}
	set x
    } -cleanup {
	close $s
	unset x s
    } -result {connection refused}







|







2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
    } -result {transport endpoint is not connected} -returnCodes 1
test socket-14.12 {[socket -async] background progress triggered by [fconfigure -error]} \
    -constraints {socket} \
    -body {
	set s [socket -async localhost [randport]]
	for {set i 0} {$i < 50} {incr i} {
	    set x [fconfigure $s -error]
	    if {$x ne ""} break
	    after 200
	}
	set x
    } -cleanup {
	close $s
	unset x s
    } -result {connection refused}
Changes to tests/unixFCmd.test.
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
set oldcwd [pwd]
cd [temporaryDirectory]

# Several tests require need to match results against the Unix username
set user {}
if {[testConstraint unix]} {
    catch {set user [exec whoami]}
    if {$user == ""} {
	catch {regexp {^[^(]*\(([^)]*)\)} [exec id] dummy user}
    }
    if {$user == ""} {
	set user "root"
    }
}

# Find a group that exists on this system, or else skip tests that require
# groups
testConstraint foundGroup 0







|


|







26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
set oldcwd [pwd]
cd [temporaryDirectory]

# Several tests require need to match results against the Unix username
set user {}
if {[testConstraint unix]} {
    catch {set user [exec whoami]}
    if {$user eq ""} {
	catch {regexp {^[^(]*\(([^)]*)\)} [exec id] dummy user}
    }
    if {$user eq ""} {
	set user "root"
    }
}

# Find a group that exists on this system, or else skip tests that require
# groups
testConstraint foundGroup 0
Changes to tests/winDde.test.
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
	    flush stdout
	}
	set timeout [after 30000 ::DoTimeout]

	# Define a restricted handler.
	proc Handler1 {cmd} {
	    if {$cmd eq "stop"} {set ::done 1}
	    if {$cmd == ""} {
		set cmd "null data"
	    }
	    puts $cmd ; flush stdout
	    return
	}
	proc Handler2 {cmd} {
	    if {$cmd eq "stop"} {set ::done 1}







|







57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
	    flush stdout
	}
	set timeout [after 30000 ::DoTimeout]

	# Define a restricted handler.
	proc Handler1 {cmd} {
	    if {$cmd eq "stop"} {set ::done 1}
	    if {$cmd eq ""} {
		set cmd "null data"
	    }
	    puts $cmd ; flush stdout
	    return
	}
	proc Handler2 {cmd} {
	    if {$cmd eq "stop"} {set ::done 1}
Changes to tools/regexpTestLib.tcl.
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    set fileId [open $inFileName r]

    set i 0
    while {[gets $fileId line] >= 0} {

	set len [string length $line]

	if {($len > 0) && ([string index $line [expr {$len - 1}]] == "\\")} {
	    if {[info exists lineArray(c$i)] == 0} {
		set lineArray(c$i) 1
	    } else {
		incr lineArray(c$i)
	    }
	    set line [string range $line 0 [expr {$len - 2}]]
	    append lineArray($i) $line







|







13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    set fileId [open $inFileName r]

    set i 0
    while {[gets $fileId line] >= 0} {

	set len [string length $line]

	if {($len > 0) && ([string index $line [expr {$len - 1}]] eq "\\")} {
	    if {[info exists lineArray(c$i)] == 0} {
		set lineArray(c$i) 1
	    } else {
		incr lineArray(c$i)
	    }
	    set line [string range $line 0 [expr {$len - 2}]]
	    append lineArray($i) $line
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
    set srcLineNum 1
    while {$lineNum < $numLines} {

	set currentLine $lineArray($lineNum)

	# copy comment string to output file and continue

	if {[string index $currentLine 0] == "#"} {
	    puts $fileId $currentLine
	    incr srcLineNum $lineArray(c$lineNum)
	    incr lineNum
	    continue
	}

	set len [llength $currentLine]







|







125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
    set srcLineNum 1
    while {$lineNum < $numLines} {

	set currentLine $lineArray($lineNum)

	# copy comment string to output file and continue

	if {[string index $currentLine 0] eq "#"} {
	    puts $fileId $currentLine
	    incr srcLineNum $lineArray(c$lineNum)
	    incr lineNum
	    continue
	}

	set len [llength $currentLine]