The source code for Tcl is managed by fossil. Tcl developers coordinate all changes to the Tcl source code at
Release Tcl 9.0.3 arises from the check-in with tag core-9-0-3.
Tcl patch releases have the primary purpose of delivering bug fixes to the userbase.
- On Unix, IsTimeNative() always defined but not always used
- Tweak install permissions
- interp creation resets encoding directory search path
- Pointer arithmetic with NULL in buildInfoObjCmd()
- TclPushVarName(): pointer overflow
- Add IWYU export pragma annotations
- Windows: Install man pages
- Windows: Install pkgconfig
- Non-existent variables are ignored if re is {}
- bug in single-argument 'max' with bignums
- Itcl 4.3.5
- http 2.10.1
- opt 0.4.10
- platform 1.1.0
- sqlite3 3.51.0
- tcltest 2.5.10
- Thread 3.0.4
- TDBC* 1.1.13
- dde 1.4.6
- Unicode 17.0.0
Release Tcl 9.0.2 arises from the check-in with tag core-9-0-2.
Tcl patch releases have the primary purpose of delivering bug fixes to the userbase.
- Better error-message than "interpreter uses an incompatible stubs mechanism"
- [$interp eval $lambda] after [eval $lambda] or vice versa fails
- tcl::mathfunc::isunordered inconsistency with some integer values
- test lseq hangs with -Os
- exec does not handle app execution aliases on Windows
- auto_execok does not find several built-in cmd commands
- Panic "Buffer Underflow, BUFFER_PADDING not enough"
- MS-VS build system: pckIndex.tcl when building for 9 misses "t" for TCL 8.6 part
- clock format -locale does not look up locale children if parent locale used first
- Missing libtcl?.?.dll.a in Cygwin
- tclEpollNotfy PlatformEventsControl panics if websocket disconnected
- Tcl_InitStubs compatibility for 9.1
- proc with more than 2**31 variables
- scan "long mantissa" %g
- "encoding system": wrong result without manifest
- lseq crash on out-of-range index
- lseq crash on nested indices
- Build broken (trunk branch) tclCompExpr.c tclOOCall.c
- Memory allocation runaway on truncated iso2022 encoding
- Missing include dir for extensions in non-default locations
- tcl::tm::path doesn't handle tilde expand
- lseq numeric overflow
- "return": broken ordering of nested -options
- Euro/Tail-sign missing from cp864 encoding
- use after free on TSD in Winsock
- use after free on Windows pipe handles
- tcl::build-info not documented
- Fix 32 bit overflow in interp limit
- Itcl 4.3.3
- sqlite3 3.49.1
- Thread 3.0.2
- TDBC* 1.1.11
- tzdata 2025b
Release Tcl 9.0.1 arises from the check-in with tag core-9-0-1.
Tcl patch releases have the primary purpose of delivering bug fixes to the userbase. As the first patch release in the Tcl 9.0.* series, Tcl 9.0.1 also includes a small number of interface changes that complete some incomplete features first delivered in Tcl 9.0.0.
- TIP 701 - Tcl_FSTildeExpand C API
- TIP 707 - ptrAndSize internal rep in Tcl_Obj
- Size modifiers j, q, z, t not implemented
- regression in tzdata, %z instead of offset TZ-name
- Tcl will not start properly if there is an init.tcl file in the current dir
- clock scan "24:00", ISO-8601 compatibility
- Temporary folder with file "tcl9registry13.dll" remains after "exit"
- Wrong result by "lsearch -stride -subindices -inline -all"
- TIP 609 - required Tcl_ThreadAlert() skipped with nested event loop
- buffer overwrite for non-BMP characters in utf-16
- zipfs info on mountpoint of executable returns zero offset in field 4"
- zlib-8.8, zlib-8.16 fail on Fedora 40, gcc 14.1.1
- install registry and dde in $INSTALL_DIR\lib always
- cannot build .chm help file (Windows)
- No known incompatibilities with the Tcl 9.0.0 public interface.
- Itcl 4.3.2
- sqlite3 3.47.2
- Thread 3.0.1
- TDBC* 1.1.10
- tcltest 2.5.9
- tzdata 2024b, corrected
Release Tcl 9.0.0 arises from the check-in with tag core-9-0-0.
Highlighted differences between Tcl 9.0 and Tcl 8.6 are summarized below, with focus on changes important to programmers using the Tcl library and writing Tcl scripts.
- Strings can be any length (that fits in your available memory)
- Lists and dictionaries can have very large numbers of elements
- Full Unicode range of codepoints
- New encodings:
utf-16/utf-32/ucs-2(le|be),CESU-8, etc. encodingoptions-profile,-failindexmanage encoding of I/O.msgcatsupports custom locale search listsourcedefaults to-encoding utf-8
- Packaging of the Tcl script library with the Tcl binary library,
meaning that the
TCL_LIBRARYenvironment variable is usually not required. - Packaging of an application into a virtual filesystem is now a supported core Tcl feature.
- This relieves limits on file descriptors imposed by legacy
select()and fixes a performance bottleneck.
- Unqualified varnames resolved in current namespace, not global. Note that in almost all cases where this causes a change, the change is actually the removal of a latent bug.
- No
--disable-threadsbuild option. Always thread-enabled. - I/O malencoding default response: raise error (
-profile strict) - Windows platform needs Windows 7 or Windows Server 2008 R2 or later
- Ended interpretation of
~as home directory in pathnames. (Seefile homeandfile tildeexpandfor replacements when you need them.) - Removed the
identityencoding. (There were only ever very few valid use cases for this; almost all uses were systematically wrong.) - Removed the encoding alias
binarytoiso8859-1. $::tcl_precisionno longer controls string generation of doubles. (If you need a particular precision, useformat.)- Removed pre-Tcl 8 legacies:
case,putsandreadvariant syntaxes. - Removed subcommands [
trace variable|vdelete|vinfo] - Removed
-eofcharoption for write channels. - On Windows 10+ (Version 1903 or higher), system encoding is always utf-8.
%b/%d/%o/%xformat modifiers (without size modifier) forformatandscanalways truncate to 32-bits on all platforms.%Lsize modifier forscanno longer truncates to 64-bit.- Removed command
::tcl::unsupported::inject. (Seecoroinjectandcoroprobefor supported commands with significantly more comprehensible semantics.)
-
Extensions built against Tcl 8.6 and before will not work with Tcl 9.0; ABI compatibility was a non-goal for 9.0. In most cases, rebuilding against Tcl 9.0 should work except when a removed API function is used.
-
Many arguments expanded type from
inttoTcl_Size, a signed integer type large enough to support 64-bit sized memory objects. The constantTCL_AUTO_LENGTHis a value of that type that indicates that the length should be obtained using an appropriate function (typicallystrlen()forchar *values). -
Ended support for
Tcl_ChannelTypeVersionless than 5 -
Introduced versioning of the
Tcl_ObjTypestruct -
Removed macros
CONST*: Tcl 9 support means dropping Tcl 8.3 support. (Replaced with standard Cconstkeyword going forward.) -
Removed registration of several
Tcl_ObjTypes. -
Removed API functions:
Tcl_Backslash(),Tcl_*VA(),Tcl_*MathFunc*(),Tcl_MakeSafe(),Tcl_(Save|Restore|Discard|Free)Result(),Tcl_EvalTokens(),Tcl_(Get|Set)DefaultEncodingDir(),Tcl_UniCharN(case)cmp(),Tcl_UniCharCaseMatch() -
Revised many internals; beware reliance on undocumented behaviors.
array default— Specify default values for arrays (note that this alters the behaviour ofappend,incr,lappend).array for— Cheap iteration over an array's contents.chan isbinary— Test if a channel is configured to work with binary data.coroinject,coroprobe— Interact with paused coroutines.clock add weekdays— Clock arithmetic with week days.const,info const*— Commands for defining constants (variables that can't be modified).dict getwithdefault— Define a fallback value to use whendict getwould otherwise fail.file home— Get the user home directory.file tempdir— Create a temporary directory.file tildeexpand— Expand a file path containing a~.info commandtype— Introspection for the kinds of commands.ledit— Equivalent tolreplacebut on a list in a variable.lpop— Remove an item from a list in a variable.lremove— Remove a sublist from a list in a variable.lseq— Generate a list of numbers in a sequence.package files— Describe the contents of a package.string insert— Insert a string as a substring of another string.string is dict— Test whether a string is a dictionary.tcl::process— Commands for working with subprocesses.*::build-info— Obtain information about the build of Tcl.readFile,writeFile,foreachLine— Simple procedures for basic working with files.tcl::idna::*— Commands for working with encoded DNS names.
chan configure ... -inputmode ...— Support for raw terminal input and reading passwords.clock scan ... -validate ...info loaded ... ?prefix?lsearch ... -stride ...— Search a list by groups of items.regsub ... -command ...— Generate the replacement for a regular expression by calling a command.socket ... -nodelay ... -keepalive ...vwaitcontrolled by several new optionsexprstring comparatorslt,gt,le,geexprsupports comments inside expressions
0NNNformat is no longer octal interpretation. Use0oNNN.0dNNNNformat to compel decimal interpretation.NN_NNN_NNN, underscores in numbers for optional readability- Functions:
isinf(),isnan(),isnormal(),issubnormal(),isunordered() - Command:
fpclassify - Function
int()no longer truncates to word size
- private variables and methods
- class variables and methods
- abstract and singleton classes
- configurable properties
method -export,method -unexport
- changed behaviour wrt command names, namespaces and resolution
- windows dos device paths inconsistencies and missing functionality
- load library (dll) from zipfs-library causes a leak in temporary folder
- lsearch -sorted -inline -subindices incorrect result
- "No error" when load fails due to a missing secondary DLL