TIP 707: Add new Tcl_Obj internal representation to hold pointer + length

Login
Author:         Ashok P. Nadkarni <[email protected]>
State:          Final
Type:           Project
Vote:           Done
Tcl-Version:    8.7
Vote-Summary:	Accepted 10/0/0
Votes-For:	AK, AN, BG, DP, HO, JN, KW, MC, RA, SL
Votes-Against:	none
Votes-Present:	none

Abstract

This TIP proposes addition of a new field to the internal Tcl_Obj representation to hold a pointer and Tcl_Size value.

Rationale

Custom Tcl_Obj internal representation often require a pointer and length internal representation. In Tcl 8, the Tcl_Obj.internalRep.ptrAndLongRep field targeted this use case. With Tcl 9, where supported lengths on 64-bit platforms are greater than ULONG_MAX on Windows, this no longer suffices for the purpose. Hijacking the twoPtrValue field involves casts, not a good practice. The alternative of a separate allocation is an unnecessary performance loss.

Specification

The following new field will be added to the Tcl_ObjIntenalRep union that holds Tcl_Obj internal representation.

struct {
   void *ptr;
   Tcl_Size size;
} ptrAndSize;

The size of the Tcl_Obj structure does not change with this addition due to the already existing twoPtrValue field.

Discussion

The integer field in the ptrAndSize is explicitly chosen to be Tcl_Size and not Tcl_WideInt, ptrdiff_t and size_t so as to not change the size of Tcl_Obj on Windows platforms.

Implementation

See the tip-707 branch.

Copyright

This document has been placed in the public domain.