Provided by: tcl9.0-doc_9.0.1+dfsg-1_all 

NAME
Tcl_RegisterObjType, Tcl_GetObjType, Tcl_AppendAllObjTypes, Tcl_ConvertToType, Tcl_FreeInternalRep,
Tcl_InitStringRep, Tcl_HasStringRep, Tcl_StoreInternalRep, Tcl_FetchInternalRep - manipulate Tcl value
types
SYNOPSIS
#include <tcl.h>
Tcl_RegisterObjType(typePtr)
const Tcl_ObjType *
Tcl_GetObjType(typeName)
int
Tcl_AppendAllObjTypes(interp, objPtr)
int
Tcl_ConvertToType(interp, objPtr, typePtr)
void
Tcl_FreeInternalRep(objPtr)
char *
Tcl_InitStringRep(objPtr, bytes, numBytes)
int
Tcl_HasStringRep(objPtr)
void
Tcl_StoreInternalRep(objPtr, typePtr, irPtr)
Tcl_ObjInternalRep *
Tcl_FetchInternalRep(objPtr, typePtr)
ARGUMENTS
const Tcl_ObjType *typePtr (in) Points to the structure containing information about the Tcl value
type. This storage must live forever, typically by being statically
allocated.
const char *typeName (in) The name of a Tcl value type that Tcl_GetObjType should look up.
Tcl_Interp *interp (in) Interpreter to use for error reporting.
Tcl_Obj *objPtr (in) For Tcl_AppendAllObjTypes, this points to the value onto which it
appends the name of each value type as a list element. For
Tcl_ConvertToType, this points to a value that must have been the
result of a previous call to Tcl_NewObj.
const char* bytes (in) String representation.
unsigned int numBytes (in) Length of the string representation in bytes.
const Tcl_ObjInternalRep* irPtr (in)
Internal object representation.
const Tcl_ObjType* typePtr (in) Requested internal representation type.
________________________________________________________________________________________________________________
DESCRIPTION
The procedures in this man page manage Tcl value types (sometimes referred to as object types or
Tcl_ObjTypes for historical reasons). They are used to register new value types, look up types, and
force conversions from one type to another.
Tcl_RegisterObjType registers a new Tcl value type in the table of all value types that Tcl_GetObjType
can look up by name. There are other value types supported by Tcl as well, which Tcl chooses not to
register. Extensions can likewise choose to register the value types they create or not. The argument
typePtr points to a Tcl_ObjType structure that describes the new type by giving its name and by supplying
pointers to four procedures that implement the type. If the type table already contains a type with the
same name as in typePtr, it is replaced with the new type. The Tcl_ObjType structure is described in the
section THE TCL_OBJTYPE STRUCTURE below.
Tcl_GetObjType returns a pointer to the registered Tcl_ObjType with name typeName. It returns NULL if no
type with that name is registered.
Tcl_AppendAllObjTypes appends the name of each registered value type as a list element onto the Tcl value
referenced by objPtr. The return value is TCL_OK unless there was an error converting objPtr to a list
value; in that case TCL_ERROR is returned.
Tcl_ConvertToType converts a value from one type to another if possible. It creates a new internal
representation for objPtr appropriate for the target type typePtr and sets its typePtr member as
determined by calling the typePtr->setFromAnyProc routine. Any internal representation for objPtr's old
type is freed. If an error occurs during conversion, it returns TCL_ERROR and leaves an error message in
the result value for interp unless interp is NULL. Otherwise, it returns TCL_OK. Passing a NULL interp
allows this procedure to be used as a test whether the conversion can be done (and in fact was done).
In many cases, the typePtr->setFromAnyProc routine will set objPtr->typePtr to the argument value
typePtr, but that is no longer guaranteed. The setFromAnyProc is free to set the internal representation
for objPtr to make use of another related Tcl_ObjType, if it sees fit.
Tcl_FreeInternalRep performs the function of the existing internal macro TclInitStringRep, but is
extended to return a pointer to the string rep, and to accept NULL as a value for bytes. When bytes is
NULL and objPtr has no string rep, an uninitialzed buffer of numBytes bytes is created for filling by the
caller. When bytes is NULL and objPtr has a string rep, the string rep will be truncated to a length of
numBytes bytes. When numBytes is greater than zero, and the returned pointer is NULL, that indicates a
failure to allocate memory for the string representation. The caller may then choose whether to raise an
error or panic.
Tcl_HasStringRep returns a boolean indicating whether or not a string rep is currently stored in objPtr.
This is used when the caller wants to act on objPtr differently depending on whether or not it is a pure
value. Typically this only makes sense in an extension if it is already known that objPtr possesses an
internal type that is managed by the extension.
Tcl_StoreInternalRep stores in objPtr a copy of the internal representation pointed to by irPtr and sets
its type to typePtr. When irPtr is NULL, this leaves objPtr without a representation for type typePtr.
Tcl_FetchInternalRep returns a pointer to the internal representation stored in objPtr that matches the
requested type typePtr. If no such internal representation is in objPtr, return NULL.
This returns a public type
typedef union Tcl_ObjInternalRep {...} Tcl_ObjInternalRep
where the contents are exactly the existing contents of the union in the internalRep field of the Tcl_Obj
struct. This definition permits us to pass internal representations and pointers to them as arguments
and results in public routines.
THE TCL_OBJTYPE STRUCTURE
Extension writers can define new value types by defining four to twelve procedures and initializing a
Tcl_ObjType structure to describe the type. Extension writers may also pass a pointer to their
Tcl_ObjType structure to Tcl_RegisterObjType if they wish to permit other extensions to look up their
Tcl_ObjType by name with the Tcl_GetObjType routine. The Tcl_ObjType structure is defined as follows:
typedef struct {
const char *name;
Tcl_FreeInternalRepProc *freeIntRepProc;
Tcl_DupInternalRepProc *dupIntRepProc;
Tcl_UpdateStringProc *updateStringProc;
Tcl_SetFromAnyProc *setFromAnyProc;
size_t version;
/* List emulation functions - ObjType Version 1 & 2 */
Tcl_ObjTypeLengthProc *lengthProc;
/* List emulation functions - ObjType Version 2 */
Tcl_ObjTypeIndexProc *indexProc;
Tcl_ObjTypeSliceProc *sliceProc;
Tcl_ObjTypeReverseProc *reverseProc;
Tcl_ObjTypeGetElements *getElementsProc;
Tcl_ObjTypeSetElement *setElementProc;
Tcl_ObjTypeReplaceProc *replaceProc;
Tcl_ObjTypeInOperatorProc *inOperProc;
} Tcl_ObjType;
THE NAME FIELD
The name member describes the name of the type, e.g. int. When a type is registered, this is the name
used by callers of Tcl_GetObjType to lookup the type. For unregistered types, the name field is
primarily of value for debugging. The remaining four members are pointers to procedures called by the
generic Tcl value code:
THE SETFROMANYPROC FIELD
The setFromAnyProc member contains the address of a function called to create a valid internal
representation from a value's string representation.
typedef int Tcl_SetFromAnyProc(
Tcl_Interp *interp,
Tcl_Obj *objPtr);
If an internal representation cannot be created from the string, it returns TCL_ERROR and puts a message
describing the error in the result value for interp unless interp is NULL. If setFromAnyProc is
successful, it stores the new internal representation, sets objPtr's typePtr member to point to the
Tcl_ObjType struct corresponding to the new internal representation, and returns TCL_OK. Before setting
the new internal representation, the setFromAnyProc must free any internal representation of objPtr's old
type; it does this by calling the old type's freeIntRepProc if it is not NULL.
As an example, the setFromAnyProc for the built-in Tcl list type gets an up-to-date string representation
for objPtr by calling Tcl_GetStringFromObj. It parses the string to verify it is in a valid list format
and to obtain each element value in the list, and, if this succeeds, stores the list elements in objPtr's
internal representation and sets objPtr's typePtr member to point to the list type's Tcl_ObjType
structure.
Do not release objPtr's old internal representation unless you replace it with a new one or reset the
typePtr member to NULL.
The setFromAnyProc member may be set to NULL, if the routines making use of the internal representation
have no need to derive that internal representation from an arbitrary string value. However, in this
case, passing a pointer to the type to Tcl_ConvertToType will lead to a panic, so to avoid this
possibility, the type should not be registered.
THE UPDATESTRINGPROC FIELD
The updateStringProc member contains the address of a function called to create a valid string
representation from a value's internal representation.
typedef void Tcl_UpdateStringProc(
Tcl_Obj *objPtr);
objPtr's bytes member is always NULL when it is called. It must always set bytes non-NULL before
returning. We require the string representation's byte array to have a null after the last byte, at
offset length, and to have no null bytes before that; this allows string representations to be treated as
conventional null character-terminated C strings. These restrictions are easily met by using Tcl's
internal UTF encoding for the string representation, same as one would do for other Tcl routines
accepting string values as arguments. Storage for the byte array must be allocated in the heap by
Tcl_Alloc. Note that updateStringProcs must allocate enough storage for the string's bytes and the
terminating null byte.
The updateStringProc for Tcl's built-in double type, for example, calls Tcl_PrintDouble to write to a
buffer of size TCL_DOUBLE_SPACE, then allocates and copies the string representation to just enough space
to hold it. A pointer to the allocated space is stored in the bytes member.
The updateStringProc member may be set to NULL, if the routines making use of the internal representation
are written so that the string representation is never invalidated. Failure to meet this obligation will
lead to panics or crashes when Tcl_GetStringFromObj or other similar routines ask for the string
representation.
THE DUPINTREPPROC FIELD
The dupIntRepProc member contains the address of a function called to copy an internal representation
from one value to another.
typedef void Tcl_DupInternalRepProc(
Tcl_Obj *srcPtr,
Tcl_Obj *dupPtr);
dupPtr's internal representation is made a copy of srcPtr's internal representation. Before the call,
srcPtr's internal representation is valid and dupPtr's is not. srcPtr's value type determines what
copying its internal representation means.
For example, the dupIntRepProc for the Tcl integer type simply copies an integer. The built-in list
type's dupIntRepProc uses a far more sophisticated scheme to continue sharing storage as much as it
reasonably can.
THE FREEINTREPPROC FIELD
The freeIntRepProc member contains the address of a function that is called when a value is freed.
typedef void Tcl_FreeInternalRepProc(
Tcl_Obj *objPtr);
The freeIntRepProc function can deallocate the storage for the value's internal representation and do
other type-specific processing necessary when a value is freed.
For example, the list type's freeIntRepProc respects the storage sharing scheme established by the
dupIntRepProc so that it only frees storage when the last value sharing it is being freed.
The freeIntRepProc member can be set to NULL to indicate that the internal representation does not
require freeing. The freeIntRepProc implementation must not access the bytes member of the value, since
Tcl makes its own internal uses of that field during value deletion. The defined tasks for the
freeIntRepProc have no need to consult the bytes member.
Note that if a subsidiary value has its reference count reduced to zero during the running of a
freeIntRepProc, that value may be not freed immediately, in order to limit stack usage. However, the
value will be freed before the outermost current Tcl_DecrRefCount returns.
THE VERSION FIELD
The version member provides for future extensibility of the structure and should be set to TCL_OBJTYPE_V0
for compatibility of ObjType definitions prior to version 9.0. Specifics about versions will be described
further in the sections below.
ABSTRACT LIST TYPES
Additional fields in the Tcl_ObjType descriptor allow for control over how custom data values can be
manipulated using Tcl's List commands without converting the value to a List type. This requires the
custom type to provide functions that will perform the given operation on the custom data representation.
Not all functions are required. In the absence of a particular function (set to NULL), the fallback is to
allow the internal List operation to perform the operation, most likely causing the value type to be
converted to a traditional list.
SCALAR VALUE TYPES
For a custom value type that is scalar or atomic in nature, i.e., not a divisible collection, version
TCL_OBJTYPE_V1 is recommended. In this case, List commands will treat the scalar value as if it where a
list of length 1, and not convert the value to a List type.
VERSION 2: ABSTRACT LISTS
Version 2, TCL_OBJTYPE_V2, allows full List support when the functions described below are provided.
This allows for script level use of the List commands without causing the type of the Tcl_Obj value to be
converted to a list.
THE LENGTHPROC FIELD
The LengthProc function correlates with the Tcl_ListObjLength C API. The function returns the number of
elements in the list. It is used in every List operation and is required for all Abstract List
implementations.
typedef Tcl_Size
(Tcl_ObjTypeLengthProc) (Tcl_Obj *listPtr);
THE INDEXPROC FIELD
The IndexProc function correlates with with the Tcl_ListObjIndex C API. The function returns a Tcl_Obj
value for the element at the specified index.
typedef int (Tcl_ObjTypeIndexProc) (
Tcl_Interp *interp,
Tcl_Obj *listPtr,
Tcl_Size index,
Tcl_Obj** elemObj);
THE SLICEPROC FIELD
The SliceProc correlates with the lrange command, returning a new List or Abstract List for the portion
of the original list specified.
typedef int (Tcl_ObjTypeSliceProc) (
Tcl_Interp *interp,
Tcl_Obj *listPtr,
Tcl_Size fromIdx,
Tcl_Size toIdx,
Tcl_Obj **newObjPtr);
THE REVERSEPROC FIELD
The ReverseProc correlates with the lreverse command, returning a List or Abstract List that has the same
elements as the input Abstract List, with the elements in the reverse order.
typedef int (Tcl_ObjTypeReverseProc) (
Tcl_Interp *interp,
Tcl_Obj *listPtr,
Tcl_Obj **newObjPtr);
THE GETELEMENTS FIELD
The GetElements function returns a count and a pointer to an array of Tcl_Obj values for the entire
Abstract List. This correlates to the Tcl_ListObjGetElements C API call.
typedef int (Tcl_ObjTypeGetElements) (
Tcl_Interp *interp,
Tcl_Obj *listPtr,
Tcl_Size *objcptr,
Tcl_Obj ***objvptr);
THE SETELEMENT FIELD
The SetElement function replaces the element within the specified list at the give index. This function
correlates to the lset command.
typedef Tcl_Obj *(Tcl_ObjTypeSetElement) (
Tcl_Interp *interp,
Tcl_Obj *listPtr,
Tcl_Size indexCount,
Tcl_Obj *const indexArray[],
Tcl_Obj *valueObj);
REPLACEPROC FIELD
The ReplaceProc returns a new list after modifying the list replacing the elements to be deleted, and
adding the elements to be inserted. This function correlates to the Tcl_ListObjReplace C API.
typedef int (Tcl_ObjTypeReplaceProc) (
Tcl_Interp *interp,
Tcl_Obj *listObj,
Tcl_Size first,
Tcl_Size numToDelete,
Tcl_Size numToInsert,
Tcl_Obj *const insertObjs[]);
THE INOPERPROC FIELD
The InOperProc function determines whether the value is present in the given list, according to
equivalent string comparison of elements. The boolResult is set to 1 (true) if the value is present, and
0 (false) if it is not present. This function implements the "in" and "ni" math operators for an abstract
list.
typedef int (Tcl_ObjTypeInOperatorProc) (
Tcl_Interp *interp,
Tcl_Obj *valueObj,
Tcl_Obj *listObj,
int *boolResult);
REFERENCE COUNT MANAGEMENT
The objPtr argument to Tcl_AppendAllObjTypes should be an unshared value; this function will not modify
the reference count of that value, but will modify its contents. If objPtr is not (interpretable as) a
list, this function will set the interpreter result and produce an error; using an unshared empty value
is strongly recommended.
The objPtr argument to Tcl_ConvertToType can have any non-zero reference count; this function will not
modify the reference count, but may write to the interpreter result on error so values that originate
from there should have an additional reference made before calling this.
None of the callback functions in the Tcl_ObjType structure should modify the reference count of their
arguments, but if the values contain subsidiary values (e.g., the elements of a list or the keys of a
dictionary) then those subsidiary values may have their reference counts modified.
SEE ALSO
Tcl_NewObj(3tcl), Tcl_DecrRefCount(3tcl), Tcl_IncrRefCount(3tcl), Tcl_BounceRefCount(3tcl)
KEYWORDS
internal representation, value, value type, string representation, type conversion
Tcl 9.0 Tcl_ObjType(3tcl)