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

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)