TIP 494: More use of size_t in Tcl 9

Login
Bounty program for improvements to Tcl and certain Tcl packages.
Author:         Jan Nijtmans <[email protected]>
State:          Final
Type:           Project
Vote:           Done
Created:        29-Dec-2017
Post-History:
Keywords:       tcl
Tcl-Version:    9.0
Tcl-Branch:     memory-API

Abstract

This TIP describes the non-controversial part of the Tcl 9 changes: Make Tcl 9 ready for the 64-bit era.

Rationale

int is the type of many Tcl API function arguments and return values, and also of many struct fields, but it doesn't provide sufficient room on 64-bit platforms.

Proposal

On 32-bit platforms this is all 100% upwards binary compatible provided no internal API is used, since some internal structs might have incompatible but externally invisible changes.

On 64-bit platforms, those changes cause binary incompatibility. Therefore the TCL_STUB_MAGIC value needs to change, so extensions compiled using Tcl 9 headers will not load in Tcl 8 and reverse.

Implications

Although those changes are binary-compatible on 32-bit platforms, there is a small potential source incompatibility. Ten functions whose return type was previously int are changed to size_t (for now, see below). This signed/unsigned change might lead to subtle difference in behavior.

The 10 functions are:

If the return value of such a function is directly used for comparison, this could lead cause the operands to be cast to unsigned int instead of int for the comparison. If an extension is compiled extension with -D_TCL_8_COMPAT, those ten functions become wrapper macros that make everything behave as if those functions return Tcl_WideInt. That's the easiest way to resolve this potential problem.

There are two other ways to make this change, without using the TCL_8_COMPAT macro:

Tk and sqlite are already converted to make full use of TIP #494. Other extensions included with Tcl, e.g. tdbc, are unaffected.

Open issues

There has been discussion regarding whether the return type of these ten functions, and possibly other functions, should instead size_t or maybe some other type. A Tcl-specific type Tcl_Size could also be defined for this. Actually, this TIP provides 2 possibilities: Without -D_TCL_8_COMPAT_ the type is size_t, and with -D_TCL_8_COMPAT_ it is Tcl_WideInt. This gives enough room for experimenting which one is best, maybe it would be better to make it ssize_t or ptrdiff_t.

There will certainly be more TIPs in the future which propose additional API changes for 9.0. This one is definitely not the last one. Therefore, this TIP doesn't make a final decision yet what will be the final type returned by those ten functions.

Implementation

The implementation of this TIP can be found in the memory-API branch.

Copyright

This document has been placed in the public domain.