Provided by: tcl8.4-doc_8.4.20-7_all bug

NAME

       Tcl_RegisterObjType,  Tcl_GetObjType,  Tcl_AppendAllObjTypes,  Tcl_ConvertToType  - manipulate Tcl object
       types

SYNOPSIS

       #include <tcl.h>

       Tcl_RegisterObjType(typePtr)

       Tcl_ObjType *
       Tcl_GetObjType(typeName)

       int
       Tcl_AppendAllObjTypes(interp, objPtr)

       int
       Tcl_ConvertToType(interp, objPtr, typePtr)

ARGUMENTS

       Tcl_ObjType   *typePtr    (in)      Points to the structure containing information about the  Tcl  object
                                           type.   This storage must live forever, typically by being statically
                                           allocated.

       CONST char    *typeName   (in)      The name of a Tcl object 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 object  onto  which  it
                                           appends  the  name  of  each  object  type  as  a  list element.  For
                                           Tcl_ConvertToType, this points to an object that must have  been  the
                                           result of a previous call to Tcl_NewObj.
_________________________________________________________________

DESCRIPTION

       The procedures in this man page manage Tcl object types.  The are used to register new object types, look
       up types, and force conversions from one type to another.

       Tcl_RegisterObjType  registers  a  new Tcl object type in the table of all object types supported by Tcl.
       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 Tcl_ObjType with name typeName.  It returns NULL if no type  with
       that name is registered.

       Tcl_AppendAllObjTypes  appends  the  name  of  each  object  type  as  a list element onto the Tcl object
       referenced by objPtr.  The return value is TCL_OK unless there was an error converting objPtr to  a  list
       object; in that case TCL_ERROR is returned.

       Tcl_ConvertToType  converts  an  object  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  to  that
       type.  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 object 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).

THE TCL_OBJTYPE STRUCTURE

       Extension  writers  can  define  new object types by defining four procedures, initializing a Tcl_ObjType
       structure to describe the type, and calling Tcl_RegisterObjType.  The Tcl_ObjType structure is defined as
       follows:
              typedef struct Tcl_ObjType {
                char *name;
                Tcl_FreeInternalRepProc *freeIntRepProc;
                Tcl_DupInternalRepProc *dupIntRepProc;
                Tcl_UpdateStringProc *updateStringProc;
                Tcl_SetFromAnyProc *setFromAnyProc;
              } Tcl_ObjType;

       The name member describes the name of the type, e.g. int.  Extension writers can look up an  object  type
       using  its name with the Tcl_GetObjType procedure.  The remaining four members are pointers to procedures
       called by the generic Tcl object code:

       The setFromAnyProc member contains  the  address  of  a  function  called  to  create  a  valid  internal
       representation from an object's string representation.
              typedef int (Tcl_SetFromAnyProc) (Tcl_Interp *interp, Tcl_Obj *objPtr);
       If  an  internal representation can't be created from the string, it returns TCL_ERROR and puts a message
       describing the error in the result object for  interp  unless  interp  is  NULL.   If  setFromAnyProc  is
       successful,  it  stores  the  new  internal  representation,  sets  objPtr's  typePtr  member to point to
       setFromAnyProc's Tcl_ObjType, 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  builtin  Tcl
       integer  type  gets  an  up-to-date string representation for objPtr by calling Tcl_GetStringFromObj.  It
       parses the string to obtain an integer and, if this succeeds, stores the  integer  in  objPtr's  internal
       representation and sets objPtr's typePtr member to point to the integer 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 updateStringProc member contains  the  address  of  a  function  called  to  create  a  valid  string
       representation from an object'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;  this  allows  string  representations  that  do  not contain null bytes to be treated as
       conventional null character-terminated C strings.  Storage for the byte array must be  allocated  in  the
       heap  by Tcl_Alloc or ckalloc.  Note that updateStringProcs must allocate enough storage for the string's
       bytes and the terminating null byte.  The updateStringProc for Tcl's  builtin  list  type,  for  example,
       builds  an  array  of strings for each element object and then calls Tcl_Merge to construct a string with
       proper Tcl list structure.  It stores this string as the list object's string representation.

       The dupIntRepProc member contains the address of a function called to  copy  an  internal  representation
       from one object 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  object  type  determines  what
       copying  its  internal  representation  means.   For  example, the dupIntRepProc for the Tcl integer type
       simply copies an integer.  The builtin list type's dupIntRepProc allocates a new array that points at the
       original element objects; the elements are shared between the two lists (and their reference  counts  are
       incremented to reflect the new references).

       The freeIntRepProc member contains the address of a function that is called when an object is freed.
              typedef void (Tcl_FreeInternalRepProc) (Tcl_Obj *objPtr);
       The  freeIntRepProc  function  can deallocate the storage for the object's internal representation and do
       other type-specific processing necessary when an object is freed.  For example, Tcl list objects have  an
       internalRep.otherValuePtr  that  points  to  an  array of pointers to each element in the list.  The list
       type's freeIntRepProc decrements the reference count for each element object  (since  the  list  will  no
       longer  refer  to  those  objects),  then  deallocates  the  storage  for  the  array  of  pointers.  The
       freeIntRepProc member can be set to NULL to indicate that the internal representation  does  not  require
       freeing.

SEE ALSO

       Tcl_NewObj, Tcl_DecrRefCount, Tcl_IncrRefCount

KEYWORDS

       internal representation, object, object type, string representation, type conversion

Tcl                                                    8.0                                     Tcl_ObjType(3tcl)