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. They 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 that 
Tcl_GetObjType can look up by name. There are other
  object types supported by Tcl as well, which Tcl chooses not to register.
  Extensions can likewise choose to register the object 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 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 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 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).
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.
THE TCL_OBJTYPE STRUCTURE¶
Extension writers can define new object types by defining four 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 Tcl_ObjType {
    char * name;
    Tcl_FreeInternalRepProc * freeIntRepProc;
    Tcl_DupInternalRepProc * dupIntRepProc;
    Tcl_UpdateStringProc * updateStringProc;
    Tcl_SetFromAnyProc * setFromAnyProc;
} 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 object code:
THE SETFROMANYPROC FIELD¶
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 cannot 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 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 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, 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 or 
ckalloc. 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 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 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 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, the list type's 
freeIntRepProc respects the storage sharing
  scheme established by the 
dupIntRepProc so that it only frees storage
  when the last object 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 object, since
  Tcl makes its own internal uses of that field during object deletion. The
  defined tasks for the 
freeIntRepProc have no need to consult the
  
bytes member.
SEE ALSO¶
Tcl_NewObj, Tcl_DecrRefCount, Tcl_IncrRefCount
KEYWORDS¶
internal representation, object, object type, string representation, type
  conversion