Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | TIP633 fconfigure -strictencoding: also implement read part |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | tip633-tcl9-fconfigure-strictencoding |
Files: | files | file ages | folders |
SHA3-256: |
995f1b858d0483cb7549c529a884ea7b |
User & Date: | oehhar 2022-09-12 14:47:48 |
Context
2022-09-19
| ||
17:40 | TIP633 fconfigure -nocomplainencoding (TCL9): replace "-strictencoding 0" by "-nocomplainencoding 1"... check-in: 68c3e3c92f user: oehhar tags: tip633-tcl9-fconfigure-strictencoding | |
2022-09-12
| ||
14:47 | TIP633 fconfigure -strictencoding: also implement read part check-in: 995f1b858d user: oehhar tags: tip633-tcl9-fconfigure-strictencoding | |
12:14 | Merge 8.7. Renumber tests and add current (IMHO wrong) results as results. check-in: 6601b40b04 user: oehhar tags: trunk, main | |
10:59 | TIP633 fconfigure -strictencoding: move transfer over the loop. Adapt test suite to use hex results ... check-in: 6fb44cf582 user: oehhar tags: tip633-tcl9-fconfigure-strictencoding | |
Changes
Changes to generic/tclIO.c.
︙ | ︙ | |||
4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 | * If there is no encoding, use "iso8859-1" -- Tcl_GetsObj() doesn't * produce ByteArray objects. */ if (encoding == NULL) { encoding = GetBinaryEncoding(); } /* * Object used by FilterInputBytes to keep track of how much data has been * consumed from the channel buffers. */ gs.objPtr = objPtr; | > > > > > > > > > > | 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 | * If there is no encoding, use "iso8859-1" -- Tcl_GetsObj() doesn't * produce ByteArray objects. */ if (encoding == NULL) { encoding = GetBinaryEncoding(); } /* * Transfer encoding strict option to the encoding flags */ if (statePtr->flags & CHANNEL_ENCODING_NOCOMPLAIN) { statePtr->inputEncodingFlags |= TCL_ENCODING_NOCOMPLAIN; } else { statePtr->inputEncodingFlags &= ~TCL_ENCODING_NOCOMPLAIN; } /* * Object used by FilterInputBytes to keep track of how much data has been * consumed from the channel buffers. */ gs.objPtr = objPtr; |
︙ | ︙ | |||
5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 5402 5403 | } } spaceLeft = length - offset; dst = objPtr->bytes + offset; *gsPtr->dstPtr = dst; } gsPtr->state = statePtr->inputEncodingState; result = Tcl_ExternalToUtf(NULL, gsPtr->encoding, raw, rawLen, statePtr->inputEncodingFlags | TCL_ENCODING_NO_TERMINATE, &statePtr->inputEncodingState, dst, spaceLeft, &gsPtr->rawRead, &gsPtr->bytesWrote, &gsPtr->charsWrote); /* * Make sure that if we go through 'gets', that we reset the | > > > > > > > > > > > | 5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 5419 5420 5421 5422 5423 5424 | } } spaceLeft = length - offset; dst = objPtr->bytes + offset; *gsPtr->dstPtr = dst; } gsPtr->state = statePtr->inputEncodingState; /* * Transfer encoding strict option to the encoding flags */ if (statePtr->flags & CHANNEL_ENCODING_NOCOMPLAIN) { statePtr->inputEncodingFlags |= TCL_ENCODING_NOCOMPLAIN; } else { statePtr->inputEncodingFlags &= ~TCL_ENCODING_NOCOMPLAIN; } result = Tcl_ExternalToUtf(NULL, gsPtr->encoding, raw, rawLen, statePtr->inputEncodingFlags | TCL_ENCODING_NO_TERMINATE, &statePtr->inputEncodingState, dst, spaceLeft, &gsPtr->rawRead, &gsPtr->bytesWrote, &gsPtr->charsWrote); /* * Make sure that if we go through 'gets', that we reset the |
︙ | ︙ | |||
6162 6163 6164 6165 6166 6167 6168 6169 6170 6171 6172 6173 6174 6175 | size_t size; dst = TclGetStringStorage(objPtr, &size) + numBytes; dstLimit = size - numBytes; } else { dst = TclGetString(objPtr) + numBytes; } /* * This routine is burdened with satisfying several constraints. It cannot * append more than 'charsToRead` chars onto objPtr. This is measured * after encoding and translation transformations are completed. There is * no precise number of src bytes that can be associated with the limit. * Yet, when we are done, we must know precisely the number of src bytes | > > > > > > > > > > | 6183 6184 6185 6186 6187 6188 6189 6190 6191 6192 6193 6194 6195 6196 6197 6198 6199 6200 6201 6202 6203 6204 6205 6206 | size_t size; dst = TclGetStringStorage(objPtr, &size) + numBytes; dstLimit = size - numBytes; } else { dst = TclGetString(objPtr) + numBytes; } /* * Transfer encoding strict option to the encoding flags */ if (statePtr->flags & CHANNEL_ENCODING_NOCOMPLAIN) { statePtr->inputEncodingFlags |= TCL_ENCODING_NOCOMPLAIN; } else { statePtr->inputEncodingFlags &= ~TCL_ENCODING_NOCOMPLAIN; } /* * This routine is burdened with satisfying several constraints. It cannot * append more than 'charsToRead` chars onto objPtr. This is measured * after encoding and translation transformations are completed. There is * no precise number of src bytes that can be associated with the limit. * Yet, when we are done, we must know precisely the number of src bytes |
︙ | ︙ |
Changes to library/http/http.tcl.
︙ | ︙ | |||
791 792 793 794 795 796 797 | # - If ::tls::socketCmd has its default value "::socket", change it to the # new value $socketCmd. # - If the old value is different, then it has been modified either by the # script or by the Tcl installation, and replaced by a new command. The # script or installation that modified ::tls::socketCmd is also # responsible for integrating ::http::socket into its own "new" command, # if it wishes to do so. | | | 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 | # - If ::tls::socketCmd has its default value "::socket", change it to the # new value $socketCmd. # - If the old value is different, then it has been modified either by the # script or by the Tcl installation, and replaced by a new command. The # script or installation that modified ::tls::socketCmd is also # responsible for integrating ::http::socket into its own "new" command, # if it wishes to do so. if {[info exists ::tls::socketCmd] && ($::tls::socketCmd eq {::socket})} { set ::tls::socketCmd $socketCmd } set token [CreateToken $url {*}$args] variable $token upvar 0 $token state |
︙ | ︙ | |||
1602 1603 1604 1605 1606 1607 1608 | # # This command is called by OpenSocket whenever a genuine socket (sockNew) has # been opened for for use by HTTP. It does two things: # (1) If $token uses a placeholder socket, this command replaces the placeholder # socket with the real socket, not only in $token but in all other requests # that use the same placeholder. # (2) It calls ScheduleRequest to schedule each request that uses the socket. | | | 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 | # # This command is called by OpenSocket whenever a genuine socket (sockNew) has # been opened for for use by HTTP. It does two things: # (1) If $token uses a placeholder socket, this command replaces the placeholder # socket with the real socket, not only in $token but in all other requests # that use the same placeholder. # (2) It calls ScheduleRequest to schedule each request that uses the socket. # # # Value of sockOld/sockNew can be "sock" (genuine socket) or "ph" (placeholder). # sockNew is ${token}(sock) # sockOld sockNew CASES # sock sock (if $reusing, and sockOld is sock) # ph sock (if (not $reusing), and sockOld is ph) # ph ph (if $reusing, and sockOld is ph) - not called in this case |
︙ | ︙ | |||
1662 1663 1664 1665 1666 1667 1668 | # Unset is called by CloseQueuedQueries and (possibly never) by geturl. # # CancelReadPipeline, CancelWritePipeline call http::Finish for each # token. # # FIXME If Finish is placeholder-aware, these traces can be set earlier, # in PreparePersistentConnection. | | | 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 | # Unset is called by CloseQueuedQueries and (possibly never) by geturl. # # CancelReadPipeline, CancelWritePipeline call http::Finish for each # token. # # FIXME If Finish is placeholder-aware, these traces can be set earlier, # in PreparePersistentConnection. if {[dict get $DoLater -traceread]} { set varName ::http::socketRdState($state(socketinfo)) trace add variable $varName unset ::http::CancelReadPipeline } if {[dict get $DoLater -tracewrite]} { set varName ::http::socketWrState($state(socketinfo)) trace add variable $varName unset ::http::CancelWritePipeline |
︙ | ︙ | |||
4378 4379 4380 4381 4382 4383 4384 | # # Return value: list of values that describe the outcome. The return is # intended to be a normal (non-error) return in all cases. # ------------------------------------------------------------------------------ proc http::SockInThread {caller defcmd sockargs} { package require Thread | | | 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 | # # Return value: list of values that describe the outcome. The return is # intended to be a normal (non-error) return in all cases. # ------------------------------------------------------------------------------ proc http::SockInThread {caller defcmd sockargs} { package require Thread set catchCode [catch {eval $defcmd $sockargs} sock errdict] if {$catchCode == 0} { set catchCode [catch {thread::transfer $caller $sock; set sock} sock errdict] } return [list $catchCode $errdict $sock] } |
︙ | ︙ |
Changes to tests/chan.test.
︙ | ︙ | |||
51 52 53 54 55 56 57 | chan configure stdout -eofchar Ā } -returnCodes error -match glob -result {bad value*} test chan-4.3 {chan command: [Bug 800753]} -body { chan configure stdout -eofchar \x00 } -returnCodes error -match glob -result {bad value*} test chan-4.4 {chan command: check valid inValue, no outValue} -body { chan configure stdout -eofchar [list \x27 {}] | | | | 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | chan configure stdout -eofchar Ā } -returnCodes error -match glob -result {bad value*} test chan-4.3 {chan command: [Bug 800753]} -body { chan configure stdout -eofchar \x00 } -returnCodes error -match glob -result {bad value*} test chan-4.4 {chan command: check valid inValue, no outValue} -body { chan configure stdout -eofchar [list \x27 {}] } -result {} test chan-4.5 {chan command: check valid inValue, invalid outValue} -body { chan configure stdout -eofchar [list \x27 \x80] } -returnCodes error -match glob -result {bad value for -eofchar:*} test chan-4.6 {chan command: check no inValue, valid outValue} -body { chan configure stdout -eofchar [list {} \x27] } -result {} -cleanup {chan configure stdout -eofchar [list {} {}]} test chan-5.1 {chan command: copy subcommand} -body { chan copy foo } -returnCodes error -result "wrong # args: should be \"chan copy input output ?-size size? ?-command callback?\"" test chan-6.1 {chan command: eof subcommand} -body { chan eof foo bar |
︙ | ︙ |
Changes to tests/cmdMZ.test.
︙ | ︙ | |||
154 155 156 157 158 159 160 | while executing "return -level 0 -code error"} -errorline 1 -errorstack * -level 0}} test cmdMZ-return-2.11 {return option handling} { list [catch {return -level 0 -code break} -> foo] [dictSort $foo] } {3 {-code 3 -level 0}} test cmdMZ-return-2.12 {return option handling} -body { return -level 0 -code error -options {-code ok} | | | 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 | while executing "return -level 0 -code error"} -errorline 1 -errorstack * -level 0}} test cmdMZ-return-2.11 {return option handling} { list [catch {return -level 0 -code break} -> foo] [dictSort $foo] } {3 {-code 3 -level 0}} test cmdMZ-return-2.12 {return option handling} -body { return -level 0 -code error -options {-code ok} } -result {} test cmdMZ-return-2.13 {return option handling} -body { return -level 0 -code error -options {-code err} } -returnCodes error -match glob -result {bad completion code "err": must be ok, error, return, break, continue*, or an integer} test cmdMZ-return-2.14 {return option handling} -body { return -level 0 -code error -options {-code foo -options {-code break}} } -returnCodes break -result {} test cmdMZ-return-2.15 {return opton handling} { |
︙ | ︙ |
Changes to tests/compile.test.
︙ | ︙ | |||
648 649 650 651 652 653 654 | # suite. # test compile-16.18.$noComp {TclCompileScript: word expansion} -body { proc LongList {} {return [lrepeat [expr {1<<10}] x]} llength [run "list [string repeat {{*}[LongList] } [expr {1<<10}]]"] } -constraints [linsert $constraints 0 knownBug] -cleanup { rename LongList {} | | | | | | | | 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 | # suite. # test compile-16.18.$noComp {TclCompileScript: word expansion} -body { proc LongList {} {return [lrepeat [expr {1<<10}] x]} llength [run "list [string repeat {{*}[LongList] } [expr {1<<10}]]"] } -constraints [linsert $constraints 0 knownBug] -cleanup { rename LongList {} } -result [expr {1<<20}] test compile-16.19.$noComp {TclCompileScript: word expansion} -body { proc LongList {} {return [lrepeat [expr {1<<11}] x]} llength [run "list [string repeat {{*}[LongList] } [expr {1<<11}]]"] } -constraints [linsert $constraints 0 knownBug] -cleanup { rename LongList {} } -result [expr {1<<22}] test compile-16.20.$noComp {TclCompileScript: word expansion} -body { proc LongList {} {return [lrepeat [expr {1<<12}] x]} llength [run "list [string repeat {{*}[LongList] } [expr {1<<12}]]"] } -constraints [linsert $constraints 0 knownBug] -cleanup { rename LongList {} } -result [expr {1<<24}] # This is the one that should cause overflow test compile-16.21.$noComp {TclCompileScript: word expansion} -body { proc LongList {} {return [lrepeat [expr {1<<16}] x]} llength [run "list [string repeat {{*}[LongList] } [expr {1<<16}]]"] } -constraints [linsert $constraints 0 knownBug] -cleanup { rename LongList {} } -result [expr {wide(1)<<32}] test compile-16.22.$noComp { Bug 845412: TclCompileScript: word expansion not mandatory } -body { # This test may crash and will fail unless Bug 845412 is fixed. proc ReturnResults args {return $args} run "ReturnResults [string repeat {x } 260]" } -constraints $constraints -cleanup { rename ReturnResults {} } -result [string trim [string repeat {x } 260]] test compile-16.23.$noComp { Bug 1032805: defer parse error until run time } -constraints $constraints -body { namespace eval x { run { proc if {a b} {uplevel 1 [list set $a $b]} if 1 {syntax {}{}} } } } -cleanup { namespace delete x } -result {syntax {}{}} test compile-16.24.$noComp { Bug 1638414: bad list constant as first expanded term } -constraints $constraints -body { run "{*}\"\{foo bar\"" } -returnCodes error -result {unmatched open brace in list} test compile-16.25.$noComp {TclCompileScript: word expansion, naked backslashes} $constraints { run {list {*}{a \n b}} |
︙ | ︙ |
Changes to tests/interp.test.
︙ | ︙ | |||
1636 1637 1638 1639 1640 1641 1642 | } -body { child hide coroutine catch {child invokehidden coroutine} m o dict get $o -errorinfo } -cleanup { unset -nocomplain m 0 interp delete child | | | 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 | } -body { child hide coroutine catch {child invokehidden coroutine} m o dict get $o -errorinfo } -cleanup { unset -nocomplain m 0 interp delete child } -result {wrong # args: should be "coroutine name cmd ?arg ...?" while executing "coroutine" invoked from within "child invokehidden coroutine"} test interp-21.1 {interp hidden} { interp hidden {} |
︙ | ︙ |
Changes to tests/io.test.
︙ | ︙ | |||
8949 8950 8951 8952 8953 8954 8955 | } -cleanup { interp delete child testobj freeallvars removeFile io-74.1 } -returnCodes error -match glob -result {can not find channel named "*"} test io-75.1 {multibyte encoding error read results in raw bytes (-strictencoding 0)} -setup { | | | | | | | | | | | | | | | < | | | | | | | | | | | | | | | | | | | > > | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | | | > > | | | > > | | | | | | | | > | | > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 8949 8950 8951 8952 8953 8954 8955 8956 8957 8958 8959 8960 8961 8962 8963 8964 8965 8966 8967 8968 8969 8970 8971 8972 8973 8974 8975 8976 8977 8978 8979 8980 8981 8982 8983 8984 8985 8986 8987 8988 8989 8990 8991 8992 8993 8994 8995 8996 8997 8998 8999 9000 9001 9002 9003 9004 9005 9006 9007 9008 9009 9010 9011 9012 9013 9014 9015 9016 9017 9018 9019 9020 9021 9022 9023 9024 9025 9026 9027 9028 9029 9030 9031 9032 9033 9034 9035 9036 9037 9038 9039 9040 9041 9042 9043 9044 9045 9046 9047 9048 9049 9050 9051 9052 9053 9054 9055 9056 9057 9058 9059 9060 9061 9062 9063 9064 9065 9066 9067 9068 9069 9070 9071 9072 9073 9074 9075 9076 9077 9078 9079 9080 9081 9082 9083 9084 9085 9086 9087 9088 9089 9090 9091 9092 9093 9094 9095 9096 9097 9098 9099 9100 9101 9102 9103 9104 9105 9106 9107 9108 9109 9110 9111 9112 9113 9114 9115 9116 9117 9118 9119 9120 9121 9122 9123 9124 9125 9126 9127 9128 9129 9130 9131 9132 9133 9134 9135 9136 9137 9138 9139 9140 9141 9142 9143 9144 9145 9146 9147 9148 9149 9150 | } -cleanup { interp delete child testobj freeallvars removeFile io-74.1 } -returnCodes error -match glob -result {can not find channel named "*"} test io-75.1 {multibyte encoding error read results in raw bytes (-strictencoding 0)} -setup { set fn [makeFile {} io-75.1] set f [open $fn w+] fconfigure $f -encoding binary # In UTF-8, a byte 0xCx starts a multibyte sequence and must be followed # by a byte > 0x7F. This is violated to get an invalid sequence. puts -nonewline $f "A\xC0\x40" flush $f seek $f 0 fconfigure $f -encoding utf-8 -strictencoding 0 -buffering none } -body { set d [read $f] binary scan $d H* hd set hd } -cleanup { close $f removeFile io-75.1 } -result "41c040" test io-75.2 {unrepresentable character write passes and is replaced by ? (-strictencoding 0)} -setup { set fn [makeFile {} io-75.2] set f [open $fn w+] fconfigure $f -encoding iso8859-1 -strictencoding 0 } -body { puts -nonewline $f "A\u2022" flush $f seek $f 0 read $f } -cleanup { close $f removeFile io-75.2 } -result "A?" # Incomplete sequence test. # This error may IMHO only be detected with the close. # But the read already returns the incomplete sequence. test io-75.3 {incomplete multibyte encoding read is ignored (-strictencoding 0)} -setup { set fn [makeFile {} io-75.3] set f [open $fn w+] fconfigure $f -encoding binary puts -nonewline $f "A\xC0" flush $f seek $f 0 fconfigure $f -encoding utf-8 -buffering none -strictencoding 0 } -body { set d [read $f] close $f binary scan $d H* hd set hd } -cleanup { removeFile io-75.3 } -result "41c0" # As utf-8 has a special treatment in multi-byte decoding, also test another # one. test io-75.4 {shiftjis encoding error read results in raw bytes (-strictencoding 0)} -setup { set fn [makeFile {} io-75.4] set f [open $fn w+] fconfigure $f -encoding binary # In shiftjis, \x81 starts a two-byte sequence. # But 2nd byte \xFF is not allowed puts -nonewline $f "A\x81\xFFA" flush $f seek $f 0 fconfigure $f -encoding shiftjis -buffering none -eofchar "" -translation lf -strictencoding 0 } -body { set d [read $f] binary scan $d H* hd set hd } -cleanup { close $f removeFile io-75.4 } -result "4181ff41" test io-75.5 {incomplete shiftjis encoding read is ignored (-strictencoding 0)} -setup { set fn [makeFile {} io-75.5] set f [open $fn w+] fconfigure $f -encoding binary # \x81 announces a two byte sequence. puts -nonewline $f "A\x81" flush $f seek $f 0 fconfigure $f -encoding utf-8 -buffering none -eofchar "" -translation lf -strictencoding 0 } -body { set d [read $f] close $f binary scan $d H* hd set hd } -cleanup { removeFile io-75.5 } -result "4181" test io-75.6 {multibyte encoding error read results in raw bytes} -setup { set fn [makeFile {} io-75.6] set f [open $fn w+] fconfigure $f -encoding binary # In UTF-8, a byte 0xCx starts a multibyte sequence and must be followed # by a byte > 0x7F. This is violated to get an invalid sequence. puts -nonewline $f "A\xC0\x40" flush $f seek $f 0 fconfigure $f -encoding utf-8 -buffering none } -body { set d [read $f] binary scan $d H* hd set hd } -cleanup { close $f removeFile io-75.6 } -result "41" # The current result cuts at the invalid sequence. IMHO, there should be an # error thrown or the whole sequence should be returned as byte (compat mode). test io-75.7 {unrepresentable character write passes and is replaced by ?} -setup { set fn [makeFile {} io-75.7] set f [open $fn w+] fconfigure $f -encoding iso8859-1 } -body { catch {puts -nonewline $f "A\u2022"} msg flush $f seek $f 0 list [read $f] $msg } -cleanup { close $f removeFile io-75.7 } -match glob -result [list {A} {error writing "*": illegal byte sequence}] # Incomplete sequence test. # This error may IMHO only be detected with the close. # But the read already returns the incomplete sequence. test io-75.8 {incomplete multibyte encoding read is ignored} -setup { set fn [makeFile {} io-75.8] set f [open $fn w+] fconfigure $f -encoding binary puts -nonewline $f "A\xC0" flush $f seek $f 0 fconfigure $f -encoding utf-8 -buffering none } -body { set d [read $f] close $f binary scan $d H* hd set hd } -cleanup { removeFile io-75.8 } -result "41c0" # The current result returns the orphan byte as byte. # This may be expected due to special utf-8 handling. # As utf-8 has a special treatment in multi-byte decoding, also test another # one. test io-75.9 {shiftjis encoding error read results in raw bytes} -setup { set fn [makeFile {} io-75.9] set f [open $fn w+] fconfigure $f -encoding binary # In shiftjis, \x81 starts a two-byte sequence. # But 2nd byte \xFF is not allowed puts -nonewline $f "A\x81\xFFA" flush $f seek $f 0 fconfigure $f -encoding shiftjis -buffering none -eofchar "" -translation lf } -body { set d [read $f] binary scan $d H* hd set hd } -cleanup { close $f removeFile io-75.9 } -result "41" # The current result cuts at the invalid sequence. IMHO, there should be an # error thrown or the whole sequence should be returned as byte (compat mode). test io-75.10 {incomplete shiftjis encoding read is ignored} -setup { set fn [makeFile {} io-75.10] set f [open $fn w+] fconfigure $f -encoding binary # \x81 announces a two byte sequence. puts -nonewline $f "A\x81" flush $f seek $f 0 fconfigure $f -encoding utf-8 -buffering none -eofchar "" -translation lf } -body { set d [read $f] close $f binary scan $d H* hd set hd } -cleanup { removeFile io-75.10 } -result "4181" # ### ### ### ######### ######### ######### # cleanup foreach file [list fooBar longfile script script2 output test1 pipe my_script \ test2 test3 cat stdout kyrillic.txt utf8-fcopy.txt utf8-rp.txt] { removeFile $file |
︙ | ︙ |
Changes to tests/result.test.
︙ | ︙ | |||
105 106 107 108 109 110 111 | set errorCode } {{a b} c} test result-6.0 {Bug 1209759} -constraints testreturn -body { # Might panic if bug is not fixed. proc foo {} {testreturn} foo | | | | 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | set errorCode } {{a b} c} test result-6.0 {Bug 1209759} -constraints testreturn -body { # Might panic if bug is not fixed. proc foo {} {testreturn} foo } -result {} test result-6.1 {Bug 1209759} -constraints testreturn -body { # Might panic if bug is not fixed. proc foo {} {catch {return -level 2}; testreturn} foo } -cleanup { rename foo {} } -result {} test result-6.2 {Bug 1649062} -setup { proc foo {} { if {[catch { return -code error -errorinfo custom -errorcode CUSTOM foo } err]} { return [list $err $::errorCode $::errorInfo] } |
︙ | ︙ |
Changes to tests/safe.test.
︙ | ︙ | |||
1170 1171 1172 1173 1174 1175 1176 | safe::interpDelete $i } -result {load of library for prefix Safepfx1 failed: can't use library in a safe interpreter: no Safepfx1_SafeInit procedure} test safe-10.1.1 {testing statics loading} -constraints tcl::test -setup { set i [safe::interpCreate] } -body { catch {interp eval $i {load {} Safepfx1}} m o dict get $o -errorinfo | | | 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 | safe::interpDelete $i } -result {load of library for prefix Safepfx1 failed: can't use library in a safe interpreter: no Safepfx1_SafeInit procedure} test safe-10.1.1 {testing statics loading} -constraints tcl::test -setup { set i [safe::interpCreate] } -body { catch {interp eval $i {load {} Safepfx1}} m o dict get $o -errorinfo } -cleanup { unset -nocomplain m o safe::interpDelete $i } -result {load of library for prefix Safepfx1 failed: can't use library in a safe interpreter: no Safepfx1_SafeInit procedure invoked from within "load {} Safepfx1" invoked from within "interp eval $i {load {} Safepfx1}"} |
︙ | ︙ | |||
1201 1202 1203 1204 1205 1206 1207 | } -returnCodes error -cleanup { safe::interpDelete $i } -result {load of library for prefix Safepfx1 failed: can't use library in a safe interpreter: no Safepfx1_SafeInit procedure} test safe-10.4.1 {testing nested statics loading / -nestedloadok} -constraints tcl::test -body { set i [safe::interpCreate -nestedloadok] catch {interp eval $i {interp create x; load {} Safepfx1 x}} m o dict get $o -errorinfo | | | 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 | } -returnCodes error -cleanup { safe::interpDelete $i } -result {load of library for prefix Safepfx1 failed: can't use library in a safe interpreter: no Safepfx1_SafeInit procedure} test safe-10.4.1 {testing nested statics loading / -nestedloadok} -constraints tcl::test -body { set i [safe::interpCreate -nestedloadok] catch {interp eval $i {interp create x; load {} Safepfx1 x}} m o dict get $o -errorinfo } -cleanup { unset -nocomplain m o safe::interpDelete $i } -result {load of library for prefix Safepfx1 failed: can't use library in a safe interpreter: no Safepfx1_SafeInit procedure invoked from within "load {} Safepfx1 x" invoked from within "interp eval $i {interp create x; load {} Safepfx1 x}"} |
︙ | ︙ | |||
1271 1272 1273 1274 1275 1276 1277 | safe::interpDelete $i } -result {wrong # args: should be "encoding convertfrom ?-nocomplain? ?-failindex var? ?encoding? data"} test safe-11.7.1 {testing safe encoding} -setup { set i [safe::interpCreate] } -body { catch {interp eval $i encoding convertfrom} m o dict get $o -errorinfo | | | 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 | safe::interpDelete $i } -result {wrong # args: should be "encoding convertfrom ?-nocomplain? ?-failindex var? ?encoding? data"} test safe-11.7.1 {testing safe encoding} -setup { set i [safe::interpCreate] } -body { catch {interp eval $i encoding convertfrom} m o dict get $o -errorinfo } -match glob -cleanup { unset -nocomplain m o safe::interpDelete $i } -result {wrong # args: should be "encoding convertfrom ?-nocomplain? ?-failindex var? ?encoding? data" while executing "encoding convertfrom" invoked from within "encoding convertfrom" |
︙ | ︙ | |||
1293 1294 1295 1296 1297 1298 1299 | safe::interpDelete $i } -result {wrong # args: should be "encoding convertto ?-nocomplain? ?-failindex var? ?encoding? data"} test safe-11.8.1 {testing safe encoding} -setup { set i [safe::interpCreate] } -body { catch {interp eval $i encoding convertto} m o dict get $o -errorinfo | | | 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 | safe::interpDelete $i } -result {wrong # args: should be "encoding convertto ?-nocomplain? ?-failindex var? ?encoding? data"} test safe-11.8.1 {testing safe encoding} -setup { set i [safe::interpCreate] } -body { catch {interp eval $i encoding convertto} m o dict get $o -errorinfo } -match glob -cleanup { unset -nocomplain m o safe::interpDelete $i } -result {wrong # args: should be "encoding convertto ?-nocomplain? ?-failindex var? ?encoding? data" while executing "encoding convertto" invoked from within "encoding convertto" |
︙ | ︙ |